【2014】扑克问题

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
",num);
    for (int i = 1;i <= num-1;i++)
        printf("%d ",a[i]);
    printf("%d
",a[num]);
}

int main()
{
    init();
    get_ans();
    output_ans();
    return 0;
}


 

原文地址:https://www.cnblogs.com/AWCXV/p/7632480.html