程序:
1 #include<stdio.h> 2 int main() { 3 int i,n,*result; 4 scanf("%d",&n); 5 int shuffle[54],card1[54],card2[54]; 6 result = n%2==0?card1:card2; 7 for(i=0; i<54; i++) { 8 scanf("%d",&shuffle[i]); 9 } 10 //初始化 11 for(i=0; i<54; i++) { 12 card1[i] = i; 13 } 14 //洗牌 15 /* 16 while(n) { 17 if(n%2==1) { 18 for(i=0; i<54; i++) { 19 card2[shuffle[i]-1] = card1[i]; 20 } 21 } else { 22 for(i=0; i<54; i++) { 23 card1[shuffle[i]-1] = card2[i]; 24 } 25 } 26 n--; 27 } 28 */ 29 while(n){ 30 for(i=0; i<54; i++){ 31 card2[shuffle[i]-1] = card1[i]; 32 } 33 n--; 34 if(n==0){ 35 break; 36 } 37 for(i=0; i<54; i++){ 38 card1[shuffle[i]-1] = card2[i]; 39 } 40 n--; 41 } 42 43 for(i=0; i<54; i++) { 44 if(result[i]/13==0) { 45 printf("%c%d",'S',result[i]%13+1); 46 } else if(result[i]/13==1) { 47 printf("%c%d",'H',result[i]%13+1); 48 } else if(result[i]/13==2) { 49 printf("%c%d",'C',result[i]%13+1); 50 } else if(result[i]/13==3) { 51 printf("%c%d",'D',result[i]%13+1); 52 } else { 53 printf("%c%d",'J',result[i]%13+1); 54 } 55 if(i<53) { 56 printf(" "); 57 } 58 } 59 }
分析:
此题用到的知识点有
1、数组:不定义字符数组,而是在输出时做判断,提高了程序效率
2、指针:最终输出的结果与洗牌次数有关,先定义一个指针,后期直接访问结果数组即可,避免了判断操作
3、三元运算符:节省代码量
4、循环语句:两个数组交替存储每次洗牌结果(注释中的程序是我一开始写的,有逻辑错误),不论最后洗多少次,都是1-2-1-2交替