Time Limit: 3 second
Memory Limit: 2 MB
有52张扑克牌,使它们全部正面朝上。从第2张牌开始,把凡是2的倍数位置上的牌翻成正面朝下;接着从第3张牌开始,把凡是3的倍数位置上的牌正面朝上的翻成正面朝下,正面朝下的翻成正面朝上;接着从第4张牌开始,把凡是4的倍数位置上的牌按此规律翻转;依次类推,直到第1张牌是52张(第52张不翻)为止。统计最后有几张牌正面朝上,并打印出它们的位置。
Input
无输入
Output
第一行输出正面朝上的牌的张数
第二行依次输出牌的位置,用空格隔开,最后以回车结束
Sample Input
Sample Output
第一行输出正面朝上的牌的张数 第二行依次输出牌的位置,用空格隔开,最后以回车结束
【题解】
只要按题目模拟就可以了.
5的话虽然是质数,但会被5整除,所以最后会是朝下。
16 有 2 8 4 4 1 16 但是4 只算一遍 1没有被算。最后是偶数,又翻回来。20的话有 2 10 4 5 1 20 但是1没有算 所以最后是奇数个,翻至背面。依次规律可以得知只有完全平方数才符合要求。同时还有52.。。。
【代码】
#include <cstdio> const int MAXN = 52; bool bo[MAXN+10]; int num = 0,a[MAXN+10]; void init() //先初始化数组 表示所有数都正面朝上 { for (int i = 1;i <= 52;i++) bo[i] = true; } void get_ans() { for (int i = 2;i <= 51;i++) //开始按照题目要求模拟即可 记住52不能翻。 for (int j = 2;j <= 52;j++) if (j % i == 0) bo[j] = 1-bo[j]; //这个算式可以表示翻面。 } void output_ans() { for (int i = 1;i <= 52;i++) //记录下答案 然后输出即可。 if (bo[i]) a[++num] = i; printf("%d\n",num); for (int i = 1;i <= num-1;i++) printf("%d ",a[i]); printf("%d\n",a[num]); } int main() { init(); get_ans(); output_ans(); return 0; }