题目链接

题目描述

请写一个程序,给出指定整数范围【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;
}

也可以采用打表的方法

posted on 2019-03-16 15:22  曹婷婷  阅读(347)  评论(0编辑  收藏  举报