PAT 1096 大美数 分数:20分

236 阅读2分钟

题目:1096 大美数 - PAT (Basic Level) Practice (中文) (pintia.cn)

解析:1096 大美数 – PAT乙级真题 – 柳婼 の blog (liuchuo.net)

坑点

因数

注意1和本身也是因数。

二.注意题目说的:

image.png N整除它的四个因子,不是N/(a+b+c+d),而是(a+b+c+d)/N.

code

我刚开始是这样写的:

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n;cin>>n;

    for(int i=0;i<n;i++)
    {
        int flag=0;
       int temp; cin>>temp;

       for(int a=0;a<temp;a++)
       {
           if(flag==1)break;
           for(int b=a+1;b<temp;b++)
           {
               if(flag==1)break;
               for(int c=b+1;c<temp;c++)
               {
                   if(flag==1)break;
                   for(int d=c+1;d<=temp;d++)
                   {
                       if((a+b+c+d)%temp==0)
                       {
                           cout<<"Yes"<<endl;

                           flag=1;

                        
                       }
                   }
               }
           }
       }
        cout<<"No"<<endl;
    }
    return 0;
}

image.png

Debug:

我们不要判断完就直接输出,而是到最后根据flag的值来输出"Yes"或"No"。

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int n;cin>>n;

    for(int i=0;i<n;i++)
    {
        int flag=0;
       int temp; cin>>temp;

       for(int a=0;a<temp;a++)
       {
           if(flag==1)break;
           for(int b=a+1;b<temp;b++)
           {
               if(flag==1)break;
               for(int c=b+1;c<temp;c++)
               {
                   if(flag==1)break;
                   for(int d=c+1;d<=temp;d++)
                   {
                       if((a+b+c+d)%temp==0)
                       {
                           flag=1;
                            break;
                       }
                   }
               }
           }
       }
      if(flag)cout<<"Yes\n";else cout<<"No\n";
    }
    return 0;
}

image.png

Debug:

我们的代码中漏了最重要的一步:即判断a,b,c,d是不是temp的因子。因为有一种可能就是a,b,c,d都不是或者有几个不是temp的因数,但是a,b,c,d相加之后的和%temp结果仍然为0。这就是为什么输出结果全是"Yes"的原因。 我们必须保证a,b,c,d都是temp的因子并且 (a+b+c+d)%temp==0,才能输出“Yes”,否则就输出No

#include <iostream>
using namespace std;
int k, num, flag;
int main() {
    cin >> k;
    for (int i = 0; i < k; i++) {
        cin >> num;
        flag = 0;
        for (int a = 1; a < num; a++) {
            if (flag == 1) break;
            if (num % a != 0) continue;
            for (int b = a + 1; b < num; b++) {
                if (flag == 1) break;
                if (num % b != 0) continue;
                for (int c = b + 1; c < num; c++) {
                    if (flag == 1) break;
                    if (num % c != 0) continue;
                    for (int d = c + 1; d <= num; d++) {
                        if (num % d != 0) continue;
                        if ((a + b + c + d) % num == 0) {
                            flag = 1;
                            break;
                        }
                    }
                }
            }
        }
        cout << (flag ? "Yes\n" : "No\n");
    }
    return 0;
}