完数问题
題目鏈接
題目描述
請寫一個程序,給出指定整數(shù)范圍【a ,b】內(nèi)所有的完數(shù),一個數(shù)如果恰好等于除它本身外的所有因子之和,這個數(shù)就稱為完數(shù),例如6是完數(shù),因為6=1+2+3。
輸入描述:
每一組數(shù)據(jù)為兩個正整數(shù),分別表示a和b(1<a<b<10^5)。
輸出描述:
指定范圍內(nèi)的所有完數(shù),每個數(shù)占一行。
示例1
輸入
復制
1 100
輸出
復制
6 28
說明
完數(shù)問題本身很簡單,但是要注意一些問題,否則會引起超時
一是:應該由于因子兩兩成對,所以只需要計算到根號n之前,只求其一
二是:應該先將1~100000之間的所有完數(shù)存放到數(shù)組中,飯后再在給定區(qū)間進行匹配,否則會因為重復計算而超時
#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之間的完數(shù)計算出來,存到數(shù)組中
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) //是完數(shù)則存入數(shù)組
{
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;
}
也可以采用打表的方法
總結
- 上一篇: 什么是UML?
- 下一篇: 小米 MIUI 日历同步QQ邮箱