PAT 乙级题解 ——1096 大美数
基本题意:
若正整数 N 可以整除它的 4 个不同正因数之和,则称这样的正整数为“大美数”。本题就要求你判断任一给定的正整数是否是“大美数”。
输入格式:
输入在第一行中给出正整数 K(≤10),随后一行给出 K 个待检测的、不超过 10^ 4 的正整数。
输出格式:
对每个需要检测的数字,如果它是大美数就在一行中输出 Yes,否则输出 No。
样例1:
输入:
3
18 29 40
输出:
Yes
No
Yes
输出:
题目分析:
注意 若正整数 N 可以整除它的 4 个不同正因数之和 这句话是 和 % N == 0, 别搞反了
AC code
#include <iostream>
#include <vector>
using namespace std;
bool check(int n) {
//因为不确定n因数的个数, 所以我们可以用不定长数组来存储
vector<int> v;
//因为n 的因数都是成对出现, 所以我们可以枚举较小的那个因数,
//随后 用 n / i表示另一个因数
for (int i = 1; i <= n / i; i++) {
if (n % i == 0) {
v.push_back(i);
//当两个因数不同时,才全部添加
if (i != n / i) v.push_back(n / i);
}
}
//遍历每个因数
// if (v.size() < 4) return false;
for (int i = 0; i < v.size(); i++)
for (int j = i + 1; j < v.size(); j++)
for (int l = j + 1; l < v.size(); l++)
for (int r = l + 1; r < v.size(); r++)
if ((v[i] + v[j] + v[l] + v[r]) % n == 0) return true;
return false;
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
//使用三元表达式来简化输入输出
// 若函数返回 true 则打印 Yes
// 反之打印 No
cout << (check(x) ? "Yes" : "No");
if (i != n - 1)
cout << endl;
}
}