- #include <iostream>
- #include<cmath>
- using namespace std;
- int main( )
- {
- int i,s,j;
- cout<<"2-1000之间的完数有:";
- for(i=2;i<=1000;i++)
- {
- s=1; //1是任何数的因子,所以不再s=1,也使下一句可以从2开始
- for(j=2;j<sqrt(i);j++) //正因为j从2开始,才让j到sqrt(i)
- if(i%j==0) s+=(j+i/j); //加上j的同时,和j对称的那个因子(i/j)也被累加了
- //思考:如果j允许从1开始,上式会将i本身也累加上去
- if(i==s) cout<<i<<" ";
- }
- cout<<endl;
- return 0;
- }

下面的程序也可以求解,考虑了效率,但不够彻底。
[cpp] view plain copy print?
- #include <iostream>
- using namespace std;
- int main( )
- {
- int i,s,j;
- cout<<"2-1000之间的完数有:";
- for(i=2;i<=1000;i++)
- {
- s=1;
- for(j=2;j<=i/2;j++)
- if(i%j==0) s+=j;
- if(i==s) cout<<i<<" ";
- }
- cout<<endl;
- return 0;
- }
这是一个C++程序,用于找出并打印2到1000之间的所有完数。程序使用两个嵌套循环,外层循环遍历2到1000,内层循环检查每个数的因子,通过累加因子来判断是否为完数。第一个版本利用了数学性质,只遍历到sqrt(i),提高了效率;第二个版本虽然也能得出结果,但效率较低,因为遍历到了i/2。
786

被折叠的 条评论
为什么被折叠?



