注意: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张。第三个: 复制一下前面的数组,也是对应的就行。