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;
}