完美数指的是因子之和等于本身的数字。比如6=1+2+3,所以6是完美数。
要求写出程序,打印小于max的所有完美数。
最简单的方法莫过于穷举了:判断1是不是完美数;2是不是……直到max。
我想出来的算法是用一个数组来保存所有数的因子和。初始化数组为0,然后遍历1-max/2:遍历1时,所有下标为1的倍数的数组元素加1(因为1是这些元素的因子);遍历2时,所有下标为2的倍数的数组元素加2(因为2是这些元素的因子)……。遍历完后,遍历该数组,找出那些值和下标相等的元素,即为完美数。
代码如下:
#include <iostream>
#include <cmath>
using namespace std;
void print_perfect(const int max)
{
int* sums = new int[max];
for (int i = 0; i < max; ++ i)
{
sums[i] = 0;
}
for (int factor = 1; factor <= (max / 2); ++ factor)
{
int num = factor * 2;
while(num <= max)
{
sums[num - 1] += factor;
num += factor;
}
}
cout << "perfect nums : ";
for (int i = 0; i < max; ++ i)
{
if (sums[i] == (i + 1))
{
cout << (i+1) << "
";
}
}
cout << endl << "==============================================" << endl;
delete[] sums;
}
int main()
{
print_perfect(10);
print_perfect(100);
print_perfect(1000);
return 0;
}
要求写出程序,打印小于max的所有完美数。
最简单的方法莫过于穷举了:判断1是不是完美数;2是不是……直到max。
我想出来的算法是用一个数组来保存所有数的因子和。初始化数组为0,然后遍历1-max/2:遍历1时,所有下标为1的倍数的数组元素加1(因为1是这些元素的因子);遍历2时,所有下标为2的倍数的数组元素加2(因为2是这些元素的因子)……。遍历完后,遍历该数组,找出那些值和下标相等的元素,即为完美数。
代码如下:
#include <iostream>
#include <cmath>
using namespace std;
void print_perfect(const int max)
{
}
int main()
{
}