/* * 问题描述:求10000以内的完数。 * 完数即:一个数等于它的不同因子的和 * 如6=1+2+3.8!=1+2+4 * xtfggef 2012/5/16 */ #include<iostream> #include<fstream> #include<vector> using namespace std; /* * 思路:先把10000以内的完数算出来,放在 * 一个vector里,再和给定的数比较,如果小于 * 给定的数,就打印出来。还有一个思路:就是 * 直接计算小于给定的数的完数,这样可以 * 少计算点儿。 */ int main(int argc, char * argv[]) { //此处引入文件操作 ifstream cin("seed.txt"); int n; vector<int> a; /* * 此处需要说明一下,为什么下面的for * 循环为i=i+2,这说明完数只有在偶数里 * 有,奇数在一个小的范围内没有完数 * 具体在哪个范围,数学界还没有证明出来 */ for(int i=2; i<10000; i=i+2) { int sum = 1; for(int j=2; j<=i/2; j++) { //如果模除为0,则是它的因子,所以加上去 if(i%j==0) sum=sum+j; } if(sum==i) a.push_back(i); } while(cin>>n) { cout << n << ":"; for(int k=0; k<a.size(); k++) { if(a[k]<=n) cout << " " << a[k]; } cout << endl; } return 0; }
百度百科完数:http://baike.baidu.com/view/640632.htm