NOJ_1025 完数

完数

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 2413            测试通过 : 515 

比赛描述

自然数中,完数寥若晨星,请在从1到某个整数范围中打印出所有的完数来。所谓“完数”是指一个数恰好等于它的所有不同因子之和。例如,6是完数,因为6=1+2+3。而24不是完数,因为24≠1+2+3+4+6+8+12=36。



输入

输入数据中含有一些整数n(1<n<10000)。

输出

对于每个整数n,输出所有不大于n的完数。每个整数n的输出由n引导,跟上冒号,然后是由空格开道的一个个完数,每个n的完数列表应占独立的一行。

样例输入

100
5000

样例输出

100: 6 28
5000: 6 28 496

题目来源

ZJUT



起初用最简单的办法解,无效,后来百度百科完数,发现大量的性质。。也有了个新方法。。

大数学家 欧拉曾推算出完全数的获得公式:如果p是 质数,且2^p-1也是质数,那么(2^p-1)X2^(p-1)便是一个完全数。
例如p=2,是一个质数,2^p-1=3也是质数,(2^p-1)X2^(p-1)=3X2=6,是完全数。
例如p=3,是一个质数,2^p-1=7也是质数,(2^p-1)X2^(p-1)=7X4=28,是完全数。
例如p=5,是一个质数,2^p-1=31也是质数,(2^p-1)X2^(p-1)=31X16=496是完全数。
——抄自百度百科,完数
终于弄懂了这个从cx2那弄来的程序
#include<iostream>
#include <math.h>
using namespace std;
int main()
{
     int n,p,i,t1,t2,temp;
    while(scanf("%d",&n)!=EOF)
    {
        
            printf("%d:",n);
        for(p=2;;p++)
        {
            t1=(int)pow(2,2*p-1);
            t2=(int)pow(2,p-1);
            if(t1-t2>n)
                break;
            temp=(int)pow(2,p)-1;

            for(i=2;i<=(int)sqrt(temp);i++)
            {
                if(temp%i==0)
                    break;
                
            }
            if(i>(int)sqrt(temp))
                printf(" %d",t1-t2);
        }
         printf("\n");
    }
  return 0;
}



你可能感兴趣的:(NOJ_1025 完数)