A1042

洗牌,共洗k次,每次将将原先的牌洗进输入好的位置。

步骤:

1 设置次数k,输入位置数列next[55],填充初始牌序start[55];

2 end[next[i]]=start[i]把新的牌序赋值给end数组,并将end数组重新赋值给start数组,共重复k次;

3 由于设置的花色数组mp[5]的序号是0-4,即用1-54/13后,结果对应相应的mp元素。因为n*13/13==1,需要将数组值全部-1,得到正确的mp序号。

   在数组值全部-1后,start[i]%13的结果为0-12,需要start[i]%13+1来得到正确的结果1-13

注:由于1-13%13的结果是1,2,3…12,0,必须将数组的整体值-1后取余得到0,1,2…12后再+1才能得到正确结果。否则13的倍数牌将显示为0.

 1 #include<stdio.h>
 2 int main(){
 3     char mp[5]={'S','H','C','D','J'};
 4     int start[55],end[55],next[55];
 5     int k;
 6     scanf("%d",&k);
 7     for(int i=1;i<=54;i++){
 8         scanf("%d",&next[i]);
 9         start[i]=i;
10     }
11     for(int j=0;j<k;j++){
12         for(int i=1;i<=54;i++){
13             end[next[i]]=start[i];
14         }
15         for(int i=1;i<=54;i++){
16             start[i]=end[i];
17         }
18     }
19     for(int i=1;i<=54;i++){
20         start[i]--;
21         printf("%c%d",mp[start[i]/13],start[i]%13+1);
22         if(i!=54) printf(" ");
23     }
24     return 0;
25 }
原文地址:https://www.cnblogs.com/Lynn-2019/p/12069218.html