题目描述
完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。
它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
例如:28,它有约数1、2、4、7、14、28,除了它本身28外,其余5个数相加,
1+2+4+7+14=28
输入n,请输出n以内(含n)完全数的个数。
数据范围:1<=n<5*10^5
题目来源
略
输入描述
输入一个数字n
输出描述:
输出不超过n的完全数的个数 示例1
输入:
1000
输出:
3
思路
定义函数用来判断一个数是否为完全数,变量sum初始值为1,对任意数n若它有因子i,则执行sum = sum + i + n/i,为减少循环次数,对每个n,从1遍历到n的平方根,即可取到所有因子。若循环完成后sum=n,则n为完全数,总数+1。
具体实现
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
bool ifperfect(int number)
{
int sum = 1;
int cycle = sqrt(number);
for(int i=2;i<=cycle;i++) //如果改为i<cycle 则无法筛选第一个完全数6
{
if(number%i)
{
continue;
}
else{
//cout<<"num is"<<number<<"sum is"<<sum<<endl;
sum = sum + i + number/i;
//cout<<"sum is"<<sum<<endl;
}
}
//if(number==(cycle*cycle)){sum = sum -cycle;} //如果number恰好为平方数,则上述程序会多加一个cycle,若不存在平方数为完全数,则此行不影响程序运行
if(sum==number)
{
cout<<"perfectnumber:"<<sum<<endl;
return true;
}
return false;
}
int main()
{
int num = -1;
int total = 0;
cout << "input a number" << endl;
if(!(cin>>num))
{
cout << "wrong input:" << num<< endl;
}
for(int i=2;i<num;i++)
{
total = total + ifperfect(i);
}
cout << "the number is:" << total<< endl;
//while(1){}
return 0;
}
时间复杂度
O(n^(3/2))
小结
1、时间复杂度计算是否为n^(3/2)?
2、数学问题:是否存在一个数,既是完全数又是平方数?