买了一份去年PAT乙级春季考试打算在25号考试前模拟考一次,成绩并不是太理想,这里贴上自己的代码和思路:
题目
7-1 大美数 (15分)
若正整数 N 可以整除它的 4 个不同正因数之和,则称这样的正整数为“大美数”。本题就要求你判断任一给定的正整数是否是“大美数”。
输入格式:
输入在第一行中给出正整数 K(≤10),随后一行给出 K 个待检测的、不超过 104的正整数。
输出格式:
对每个需要检测的数字,如果它是大美数就在一行中输出 Yes,否则输出 No。
输入样例:
3
18 29 40
输出样例:
Yes
No
Yes
分析:这题只拿到11分,最后两个测试点超时。思路是先将所有的因数放入一个数组中,然后嵌套四个for循环进行判断,能否相加然后整除。
这里发现了我数学知识上的一个漏洞:a整除b的意思是b % a == 0,而不是a % b == 0
#include <iostream>
#include <vector>
#include <map>
using namespace std;
bool judge(int);
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
int num;
cin >> num;
if (judge(num))
cout << "Yes\n";
else
cout << "No\n";
}
return 0;
}
bool judge(int n)
{
vector<int> vec;
map<int, bool> mp;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (!mp[i] && !mp[j] && i * j == n)
{
vec.push_back(i);
mp[i] = true;
vec.push_back(j);
mp[i] = true;
}
}
}
if (vec.size() < 4)
return false;
else
{
for (int i = 0; i < vec.size(); i++)
{
for (int j = i + 1; j < vec.size(); j++)
{
for (int k = j + 1; k < vec.size(); k++)
{
for (int m = k + 1; m < vec.size(); m++)
{
int num = vec[i] + vec[j] + vec[k] + vec[m]<