PAT乙级 1096 大美数
1096 大美数 (15 分)
若正整数 N 可以整除它的 4 个不同正因数之和,则称这样的正整数为“大美数”。本题就要求你判断任一给定的正整数是否是“大美数”。
输入格式:
输入在第一行中给出正整数 K(≤10),随后一行给出 K 个待检测的、不超过 10^4的正整数。
输出格式:
对每个需要检测的数字,如果它是大美数就在一行中输出 Yes,否则输出 No。
输入样例:
3
18 29 40
输出样例:
Yes
No
Yes
思路
- 先找出所有因数,一个for
- 每四个因数一组相加(四个for嵌套)
- 相加得到sum,判断sum是否能被给出的数整除(sum%x==0)
测试点3分析
测试点3上卡了一会,最后发现测试点三是类似25,36,49这样,存在相同因数相乘的数。
起初的找因数用的代码是
int temp=sqrt(a[e]); //将sqrt()的结果强制转换int
for(i=1;i<=temp;i++)
{
s.push_back(i);
s.push_back(a[e]/i); //a[e]是输入数
}
从上面的代码看,很显然如果输入数是25,会两次重复push_back(5)。
后续数组中就会多出一个相同因素,与题目所说的不同因数相加矛盾。
上述代码如果需要改善加个if判断即可。
代码
#include <iostream>
#include <math.h>
#include <vector>
using namespace std;
int main()
{
int i=0,j=0,k=0,f=0,e=0;
int n=0,flag=0,sum=0;
int a[10];
cin>>n;
getchar();
for(e=0;e<n;e++)
{
vector<int> s;
cin>>a[e];
for(i=1;i<=a[e];i++)
if(a[e]%i==0)
s.push_back(i);
flag=0;
int q=s.size();
if(q<4)
flag=2;
for(i=0;i<q-3&&flag==0;i++)
for(j=i+1;j<q-2&&flag==0;j++)
for(k=j+1;k<q-1&&flag==0;k++)
for(f=k+1;f<q&&flag==0;f++)
{
sum=s[i]+s[j]+s[k]+s[f];
if(sum%a[e]==0)
flag=1;
}
if(flag==0||flag==2)
cout<<"No";
else if(flag==1)
cout<<"Yes";
if(e!=n-1)
cout<<endl;
}
return 0;
}