1.完全数 原题链接:725. 完全数 - AcWing题库
循环到 `sqrt(x)` 对称
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
int x;
cin >> x;
int sum = 0;
//如果循环到x,复杂度太高。
//sqrt(x),对称思想
for (int j = 1; j <= sqrt(x); j++)
{
if (x % j == 0)
{
//在sqrt(x)的右边,还要加上左边对应的
//如8:1,2,sqrt(8),4,循环到sqrt(8)位置,还需要加上右边的4 (8/2=4)
sum += j + x / j;
}
//对于完全平方数,如9,加了两遍3,需要减去一个3
//注意还要and上x%j==0,确保他俩是整数
if(x / j == j && x % j == 0) sum -= j;
}
//sum += j + x / j; x除以1时包括了x,需要减掉
sum -= x;
if (sum == x) {
printf("%d is perfect\n", x);
}
else {
printf("%d is not perfect\n", x);
}
}
return 0;
}
2.质数 726. 质数 - AcWing题库
与上题类似
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
{
int x;
cin >> x;
int flag = 1;
for (int j = 2; j <= sqrt(x); j++)
{
if (x % j == 0)
{
flag = 0;
printf("%d is not prime\n", x);
break;
}
}
if (flag == 1) printf("%d is prime\n", x);
}
return 0;
}