比赛描述
输入
输入数据中含有一些整数n(1<n<10000)。
输出
对于每个整数n,输出所有不大于n的完数。每个整数n的输出由n引导,跟上冒号,然后是由空格开道的一个个完数,每个n的完数列表应占独立的一行。
样例输入
100
5000
样例输出
100: 6 28
5000: 6 28 496
题目来源
ZJUT
起初用最简单的办法解,无效,后来百度百科完数,发现大量的性质。。也有了个新方法。。
#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; }