为了账号安全,请及时绑定邮箱和手机立即绑定

C++求完数

C++求完数

C++
慕婉清6462132 2018-07-29 21:21:16
请高手帮我找出这个求完数的错误:#include<iostream.h>void main(){int m;for(m=1;m<=1000;m++){int k=0;for(int i=1;i<=m;i++){if((m%i)==0)k=k+i;}if(k==m)cout<<" "<<m<<endl;}}
查看完整描述

2 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

for(int i=1;i<=m;i++)是错的,完美数是真因数之和,比如6=1+2+3,6本身是不算6的真因数的。

#include<iostream.h>

void main()
{
int m;
for(m=1;m<=1000;m++)
{
int k=0;
for(int i=1;i<m;i++)//这里修改了
{
if((m%i)==0)
k=k+i;
}
if(k==m)
cout<<" "<<m<<endl;
}
}

查看完整回答
反对 回复 2018-08-02
?
HUX布斯

TA贡献1876条经验 获得超6个赞

是这样的……

所谓“完数”是指它的所有小于它本身的因子之和(即不包括本身)等于它本身的数。如:
6是一个完数:6=1+2+3。

要知道1不是完数,而你的程序定义的m是从1开始求,当然会出错咯,还有就是第二个循环i不应该等于m,应该小于m。

还有一点就是,这样的程序效率不高,因为只要比到一半就行了……

下面是我帮你改的程序……

#include<iostream.h>

void main(){
int m;
for(m=2;m<=1000;m++)//这里从2开始,因为不考虑1
{
int k=0;
for(int i=1;i<=m/2;i++)//这里只要比到一半就行了,没必要比到m,因为大于m/2的数不可能被m整除……
{
if((m%i)==0)
k=k+i;
}
if(k==m)
cout<<" "<<m<<endl;
}
}

希望对你有所帮助……

查看完整回答
反对 回复 2018-08-02
  • 2 回答
  • 0 关注
  • 1077 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信