若正整数 N 可以整除它的 4 个不同正因数之和,则称这样的正整数为“大美数”。本题就要求你判断任一给定的正整数是否是“大美数”。
输入格式:
输入在第一行中给出正整数 K(≤10),随后一行给出 K 个待检测的、不超过 104 的正整数。
输出格式:
对每个需要检测的数字,如果它是大美数就在一行中输出 Yes
,否则输出 No
。
输入样例:
3
18 29 40
输出样例:
Yes
No
Yes
这道题看了几遍没啥思路,主要卡到怎么遍历得到四个不同正因数之和,查了下网上资料 四层for遍历。 参考网上的思路写了下代码 卡到测试点1 测试点1是因为 求正因数时 判断条件是小于等于。测试点2 3 4是因为 每层for遍历时需要设置个标志位 ,一旦找到整除结果 就跳出四层for。还有一点就是n整除b, 数学上表达是 b%n==0 ,我的代码如下
#include<vector>
#include <iostream>
using namespace std;
int main()
{int n;cin >> n;for (int i = 0; i < n; i++){int temp;vector<int>veca;cin >> temp;bool flag = false;for (int j = 1; j <=temp; j++){if (temp %j== 0){veca.push_back(j);}}if (veca.size() < 4){cout << "No" << endl;continue;}for (int a = 0; a < veca.size()&&!flag; a++){for (int b = a+1; b < veca.size()&&!flag; b++){for (int c = b+1; c < veca.size()&&!flag; c++){for (int d = c+1; d < veca.size()&&!flag; d++){int sum = veca[a] + veca[b] + veca[c] + veca[d];if (sum % temp ==0){cout << "Yes" << endl;flag = true;}}}}}if (!flag){cout << "No" << endl;}}
}