题目:1096 大美数 - PAT (Basic Level) Practice (中文) (pintia.cn)
解析:1096 大美数 – PAT乙级真题 – 柳婼 の blog (liuchuo.net)
坑点
因数
注意1和本身也是因数。
二.注意题目说的:
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;
}
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;
}
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;
}