2 solutions

  • 0
    @ 2024-4-27 10:40:26

    本题数据量小,可直接模拟求解,但这里还是给出一个时间复杂度和代码量略微优化的思路。

    题中所有牌正面朝上,从第二张牌开始按照倍数翻转牌面。由此我们假设所有牌一开始都为正面朝下,从第i张牌开始翻转i的倍数对应的扑克牌。此时,我们可以发现第n张牌的翻转次数由n的因数个数决定。易知当n非完全平方数时,其因数个数(也就是翻转次数)必为偶数,即翻转完成后仍然正面朝下;当n为完全平方数时,其因数个数为奇数,翻转过程结束后为正面朝上。(注:能表示成一个整数的平方的数即为完全平方数。)

    所以我们直接编程筛选1~52之间的完全平方数。由于核心代码量极少,可以3行解决(不考虑输出格式的情况下),因此建议各位自行编写程序解决,这里给出一段扑克牌总数为n的情况下的核心代码参考。

    printf("%d\n",sqrt(n));
    for(int i=1;i<=sqrt(n);++i)
        printf("%d ",i*i);
    

    sqrt(n)函数定义于头文件 <cmath>中。

    • 0
      @ 2023-9-9 16:25:44
      #include <bits/stdc++.h>          		//头文件
      using namespace std;              		//命名空间
      
      int main()                              //主函数,程序入口
      {
          bool a[53]={0};
          int sum=0,b=0;
          for(int i=2;i<=52;i++)
          {
              for(int j=i;j<=52;j++)
              {
                  if(j%i==0)
                  {
                      if(a[j]==0)
                          a[j]=1;
                      else
                          a[j]=0;
                  }
              }
          }
          for(int i=1;i<=52;i++)
              if(a[i]==0)
                  sum++;
          cout<<sum<<endl;
          for(int i=1;i<=52;i++)
          {
              if(a[i]==0)
              {
                  if(b==1)
                      cout<<" "<<i;
                  else 
                      cout<<i;               
                  b=1;
              }
          }
      	return 0;                        	//程序结束,返回
      }
      
      • 1

      Information

      ID
      227
      Time
      1000ms
      Memory
      128MiB
      Difficulty
      8
      Tags
      # Submissions
      35
      Accepted
      11
      Uploaded By