#include<stdlib.h>
#include<time.h>
#define N 52 //牌张总数
#define M 13 //每花色张数
char hs[4]={5,4,3,6}//花色数组:梅花、红心、方块、黑桃字符对应的ASCII码
char hx[]={"JQKA"}// 对应11,12,13,14共四张大于10的牌符号
//生成顺序扑克牌数组: 1~52,梅花1~13,红心14~26,方块27~39,黑桃40~52
void newDeck(int *a) { int ifor ( i=0i<Ni++ ) a[i]=i+1}
//洗牌,将花色和顺序打乱
void Shuffle(int *a) { int s,i,j,t
srand((unsigned int)time(NULL))//利用当前时间生成随机数种子
s=rand()%11+5printf("随机洗牌%d遍\n",s)//第1个随机数当成洗牌次数, 洗牌次数大于等于5,小于等于15
for ( i=0i<si++ ) {
for ( j=0j<Nj++ ) {
s=rand()%52//随机数范围0~51,对应a数组下标
t=a[j]a[j]=a[s]a[s]=t//第j张牌和第s张牌交换
}
}
}
//发牌并显示
void Deal(int a[N],int b[4][M]) { int i,j
for ( i=0i<4i++ ) for ( j=0j<Mj++ ) b[i][j]=a[i*M+j]
}
//理牌
void Collating(int a[4][M]) { int i,j,k,h
for ( h=0h<4h++ )
for ( i=0i<M-1i++ )
for ( j=i+1j<Mj++ )
if ( a[h][i]<a[h][j] ) {
k=a[h][i]a[h][i]=a[h][j]a[h][j]=k
}
}
//显示
void Display(int a[4][M]) { int i,j,s
for ( i=0i<4i++ ) {
for ( j=0j<Mj++ ) {
s=a[i][j]-1printf("%c",hs[s/M])
s%=Mif ( s<9 ) printf("%d ",s+2)else printf("%c ",hx[s-9])
}
printf("\n")
}
}
void main() { int Deck[N],hands[4][M]
newDeck(Deck)//新扑克牌
Shuffle(Deck)//洗牌
Deal(Deck,hands)//发牌
Collating(hands)//理牌
Display(hands)//显示
printf("\n\n")system("pause")
}
#include <stdio.h>#include <stdlib.h>
#include <time.h>
struct POKER
{
int num // A:1 , J:11 , Q:12 , K:13
int color //黑1,红2,梅3,方4
}s[52]
int main()
{
int i,num,color
memset(s,0,sizeof(struct POKER)*52)
srand((unsigned)time(0))
int count=0
while(count<52)
{
num=rand()%13+1
color=rand()%4+1
int flag_skip=0,flag_end=0
for(i=0i<52i++)
{
if(s[i].num==num && s[i].color==color)
{
flag_skip=1
break
}
}
if(flag_skip==1)
{
continue
}
while(1)
{
i=rand()%52
if(s[i].num==0)
{
s[i].num=num
s[i].color=color
count++
break
}
else
{
continue
}
}
}
for(i=0i<52i++)
{
if(i%13==0)
{
printf("\n玩家%d : ",i/13+1)
}
switch(s[i].num)
{
case 1: putchar('A')break
case 11: putchar('J')break
case 12: putchar('Q')break
case 13: putchar('K')break
default: printf("%d",s[i].num)
}
switch(s[i].color)
{
case 1: putchar(6)break
case 2: putchar(3)break
case 3: putchar(5)break
case 4: putchar(4)break
default: printf(" ")
}
printf(" ")
}
return 0
}
下面是正确的代码,没有用链表,通过4个数组来做的,必要的注释我都加了。不理解可以问我。cout相当于printf,cin相当于scanf。
#include "iostream"
using namespace std
int main()
{
int num
cout <<"请输入特定数n:"
cin >>num
int *arry = new int[2*num]
int *temp = new int[2*num]
int *t1 = new int[num]
int *t2 = new int[num]
//初始化数组
for(int j=0j<2*numj++)
{
arry[j] = temp[j] = j
}
//以下是循环部分
bool gogo = true
int count = 0
while(gogo)
{
//更新奇、偶数组
for(int i=0i<2*numi++)
{
if(i<num)
t1[i] = temp[i]
else
t2[(i-num)] = temp[i]
}
//重组temp数组
for(i=0i<2*numi++)
{
if(i%2==0)
temp[i] = t2[i/2]
else
temp[i] = t1[(i-1)/2]
}
//判断重组后的数组temp是否和原来的数组一样
for(i=0i<2*numi++)
{
if(arry[i] != temp[i])
{
break
}
}
//如果完全相同,则此时 i==2n
if(i==2*num)
gogo = false
count++
}
cout <<count <<"次后数组恢复到原来的次序。"
return 0
}