发个今天通过的面试题 有一副扑克分别存入char Cards[54]中,0,1表示大小王,2-14表示红桃2-A,15-27表示黑桃2-A,28-42表示梅花2-A,43-54表示方方2-A,要求写一个shuffle函数实现洗牌的功能。大家有好的算法写出来看看!分享一下:) 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 利用随机数, k=rand()%54;产生2个数利用第三个变量 char 交换 数值循环 随机数次 >=1000 按实际情况的话,在洗牌的时候会把牌分成两到三份,所以产生两个不能同时为0和53的随机数,再把这不在这两个数范围内的牌一起移到Cards中的最前面,而位置在这两个数范围内的牌一起提到最后面,这是一次执行过程 我的方法:1、做一次循环:for(i=0;i<54;i++)2、在循环内部进行交换,详细方法如下:(1)、首先产生一个 0 到 53 之间的随机数,实际上是作为数组的下标;(2)、进行交换,先把 Cards[i] 放入临时变量中,然后 Cards[i]=Cards[随机数] Cards[随机数]=临时变量3、结束循环把上面的程序做成函数,执行一次,一共交换54次;如果需要,多调用几次这个函数即可。函数如下:void Shuffle( unsigned char * pCards , unsigned char times = 1 ){ int i,j; unsigned char k; // 随机数 unsigned char ucTemp; // 临时变量 for(i=0;i<times;i++) { srand( (unsigned)time( NULL ) ); // 随机种子 for(j=0;j<54;j++) { k = rand()%53; ucTemp = *(pCards+i); *(pCards+i) = *(pCards+k); *(pCards+k) = ucTemp; } }} 同意这位仁兄的想法,很实际1.先定义三个数组a[],b[],c[],原牌序为all[]=a[]+b[]+c[]2.再定义两个Rand%54的变量,分别做为“取出”牌的上下标存储到b[]中3.进行排序,可写多类算法在里面,如原牌序为a[]+b[]+c[],现在的牌序为All[]=b[]+a[]+c[] 谢谢,3楼和5楼的方法也可行,不过我自己当时用的6楼的方法,时间紧没有时间多想:)void Shuffle(char Cards[54]){ int i,j; char k; // 随机数 char *temp; // 交换临时变量 srand( (unsigned)time( NULL ) ); for { j=0;j<54;j++) { k=rand()%54; //保存随机数 temp=&Cards[j]; Cards[j]=Cards[k]; Cards[k]=*temp; }} 我产生数组下标时做错了,应改为:rand()%54这样才能保证取到 0 ~ 53 之间的下标。 我怎么觉得用SelectObject备份就的对象,然后最后再给他进行恢复没有必要? 帮我澄清一个概念!!重载??还是重写? ODBC MFC的问题 望好心人帮忙 很急! 一个很难的问题,在我的键盘钩子中,怎么屏蔽网页中的密码? 谁能帮我看下这个程序段 VC调试问题:不能查看变量的值 这些东西是干什么的 请问用微软SAPI的speak怎样实现语音循环播放?急 当我取得某个窗口的HWND之后怎么让这个窗口变为活动窗口??? 100分求你一点小小提示 getsystemmetrics问题 掩码问题
利用随机数, k=rand()%54;产生2个数利用第三个变量 char 交换 数值循环 随机数次 >=1000
我的方法:
1、做一次循环:for(i=0;i<54;i++)2、在循环内部进行交换,详细方法如下:(1)、首先产生一个 0 到 53 之间的随机数,实际上是作为数组的下标;(2)、进行交换,先把 Cards[i] 放入临时变量中,然后 Cards[i]=Cards[随机数] Cards[随机数]=临时变量3、结束循环
把上面的程序做成函数,执行一次,一共交换54次;如果需要,多调用几次这个函数即可。函数如下:
void Shuffle( unsigned char * pCards , unsigned char times = 1 )
{
int i,j; unsigned char k; // 随机数
unsigned char ucTemp; // 临时变量 for(i=0;i<times;i++)
{
srand( (unsigned)time( NULL ) ); // 随机种子 for(j=0;j<54;j++)
{
k = rand()%53; ucTemp = *(pCards+i);
*(pCards+i) = *(pCards+k);
*(pCards+k) = ucTemp;
}
}
}
1.先定义三个数组a[],b[],c[],原牌序为all[]=a[]+b[]+c[]
2.再定义两个Rand%54的变量,分别做为“取出”牌的上下标存储到b[]中
3.进行排序,可写多类算法在里面,如原牌序为a[]+b[]+c[],现在的牌序为All[]=b[]+a[]+c[]
时间紧没有时间多想:)void Shuffle(char Cards[54])
{
int i,j;
char k; // 随机数
char *temp; // 交换临时变量
srand( (unsigned)time( NULL ) );
for { j=0;j<54;j++)
{
k=rand()%54; //保存随机数
temp=&Cards[j];
Cards[j]=Cards[k];
Cards[k]=*temp;
}
}
我产生数组下标时做错了,应改为:rand()%54这样才能保证取到 0 ~ 53 之间的下标。