2478 - 【数组】翻扑克牌
上机练习5.1.6 有52张扑克牌,使它们全部正面朝上。从第2张牌开始,把凡是2的倍数位置上的牌翻成正面朝下;接着从第3张牌开始,把凡是3的倍数位置上的牌正面朝上的翻成正面朝下,正面朝下的翻成正面朝上;接着从第4张牌开始,把凡是4的倍数位置上的牌按此规律翻转;依此类推,直到第1张要翻的牌是第52张为止。统计最后有几张牌正面朝上,并打印出它们的位置。
(PS:其实本题还蕴含数学知识哦,当然这需要我们分析翻牌动作的内含,你的程序正确后观察结果数据你能发现吗?)
Input
无输入。
Output
第一行,正面朝上的牌数;
第二行,从小到大输出正面朝上牌的位置,用空格分隔,行尾不能有空格;
Examples
Input
Output
Solution C
/*有52张扑克牌,使它们全部正面朝上。从第2张牌开始,把凡是2的倍数位置上的牌翻成正面朝下; 接着从第3张牌开始,把凡是3的倍数位置上的牌正面朝上的翻成正面朝下,正面朝下的翻成正面朝上; 接着从第4张牌开始,把凡是4的倍数位置上的牌按此规律翻转; 依此类推,直到第1张要翻的牌是第52张为止。统计最后有几张牌正面朝上,并打印出它们的位置。*/ #include<stdio.h> #include<stdlib.h> #include<string.h> int a[53]; int q[53]; int main() {int m=0,i,j,c=0,k=0; memset(a,0,sizeof(a));//0 up for(i=2;i<=52;i++) { for(j=i;j<=52;j=j+i) { a[j]=!a[j]; }} for(m=1;m<=52;m++) {if (a[m]==0){q[c++]=m;}} printf("%d\n",c); for(i=0;i<c;i++) if(k==0){printf("%d",q[i]);k=1;} else printf(" %d",q[i]);return 0;}
Solution C++
#include<cmath> #include<iostream> using namespace std; int main() { int i; bool a[52+1]; for (i=1;i<=52;i++) a[i]=true; for (i=2;i<=52;++i) { int j=i; while (j<=52) {a[j]=!a[j]; j=j+i;} } int m=0; for (i=1;i<=52;i++) if (a[i]) m++; cout<<m<<endl<<1; for (i=2;i<=52;++i) if (a[i]) cout<<" "<<i; cout<<endl; return 0; }