题目链接
题目描述
请写一个程序,给出指定整数范围【a ,b】内所有的完数,一个数如果恰好等于除它本身外的所有因子之和,这个数就称为完数,例如6是完数,因为6=1+2+3。
输入描述:
每一组数据为两个正整数,分别表示a和b(1<a<b<10^5)。
输出描述:
指定范围内的所有完数,每个数占一行。
示例1
输入
1 100
输出
6 28
说明
完数问题本身很简单,但是要注意一些问题,否则会引起超时
一是:应该由于因子两两成对,所以只需要计算到根号n之前,只求其一
二是:应该先将1~100000之间的所有完数存放到数组中,饭后再在给定区间进行匹配,否则会因为重复计算而超时
#include<iostream> #include<math.h> using namespace std; //采用此方法运行时间太长 /*bool isWanshu(int n) { int sum = 1; for(int i = 2;i<=sqrt(n*1.0);i++) { if(n%i==0) { sum+=i; sum += n/i; } } if(sum == n && n!=1) return true; else return false; }*/ //应先将1-100000之间的完数计算出来,存到数组中 int wanshu[10] = {0}; int index = 0; void findWanshu() { int sum; for(int n=2;n<100000;n++) { sum = 1; //1一定是因子 for(int i = 2;i<=sqrt(n*1.0);i++)//只需计算到根号n之前 { if(n%i==0) { sum+=i; sum += n/i; } } if(sum==n) //是完数则存入数组 { wanshu[index] = n; index++; } } } int main() { findWanshu(); int a = 0; int b = 0; while(cin>>a>>b) { for(int j = 0;j<index;j++) { if(wanshu[j]>=a && wanshu[j]<=b) cout<<wanshu[j]<<endl; } } return 0; }
也可以采用打表的方法