zoukankan      html  css  js  c++  java
  • 【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;
    }
    


     

  • 相关阅读:
    剑指 Offer 30. 包含min函数的栈
    剑指 Offer 12. 矩阵中的路径
    剑指 Offer 11. 旋转数组的最小数字
    剑指 Offer 04. 二维数组中的查找
    LeetCode——139. 单词拆分
    LeetCode——(每日一题)恢复空格
    MySQL专职DBA博客目录-周万春
    MySQL专职DBA,微信群,技术群,交流群,开车群
    DBA生产经验总结
    创建MySQL账户
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7632480.html
Copyright © 2011-2022 走看看