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


     

  • 相关阅读:
    Linux IO模型
    linux进程管理
    shell之判断文件是否存在
    python之hashlib模块(MD5校验)
    Docker实现退出container后保持继续运行的解决办法
    Pycharm上python运行和unittest运行两种执行方式解析
    Linux du与df命令的差异
    Linux lsof命令详解
    Selenium执行完毕未关闭chromedriver/geckodriver进程的解决办法(java版+python版)
    理解Python中的闭包
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7632480.html
Copyright © 2020-2023  润新知