C语言编程题-洗牌

Python013

C语言编程题-洗牌,第1张

我解决了这个问题,程序如下:

注意:n不能大于500,否则你就得改数组A和B的大小

#include <stdio.h>

int A[1000],B[500]

void main()

{

int m,n,i

int flag(int)

void exchange(int)

printf("input n:")

scanf("%d",&n)

for(i=0,m=n*2i<mi++) A[i]=i

i=0

do {exchange(n)i++}

while(flag(m))

printf("Times: %d",i)

}

void exchange(int n)

{

int i

for(i=0i<ni++)

B[i]=A[i+n]

for(i=n-1i>=0i--)

A[i*2+1]=A[i]

for(i=0i<ni++)

A[i*2]=B[i]

}

洗牌就随机排序的问题,所以就需要使用库函数rand(),或者自己编写一个伪随机数来实现。

C++里STL里有一个函数random_shuffle()就能实现这样的功能。

#include <stdlib.h>

#include <time.h>

#include <stdio.h>

// 洗牌函数

void random_shuffle(int * array, int len)

{

int * p = array, temp, pos

for (int i = 1 i < len ++i)

{

pos  = rand() % i

temp = *p

*p++ = array[pos]

array[pos] = temp

}

}

// 显示函数

void print(int * array)

{

int i

const char sign1[][4] = {"红", "黑", "方", "草"}

const char sign2[][4] = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"}

for(i=0 i<52 ++i)

{

printf("%s%2s  ", sign1[array[i] / 13], sign2[array[i] % 13])

if(i % 13 == 12) printf("\n")

}

printf("\n")

}

int main()

{

srand(time(NULL)) // 初始化随机数

int card[52], i

for(i=0 i<52 ++i) card[i] = i // 初始化牌

print(card)

random_shuffle(card, 52) // 洗牌

print(card)

return 0

}

这种小case也能上竞赛的门面上?这个问题其实很简单的啊,就只要三个函数而已。一个函数对应一种模式,扑克牌的四种花色可以用四个数组来表示,每个数组13张,再加大小王。(或者更简单的你直接都放在一个数组里。)第一个函数:随机产生四个随机数然后根据这些数字显示对应的值即可。第二个: 先产生27个随机数输出,然后在输出剩下的27张。第三个: 复制一下前面的数组,也是对应的就行。