求1000以内的完数,自己的程序感觉写的没有问题,但是不出结果,大侠伸伸手啊!

xfr_1982 2007-06-12 12:19:54
附代码:
#include "stdio.h"

void main()
{
int n;
int i;
int j=0;
int k;
int sum;
int s[20];

for(n=2;n<=1000;n++)
{
sum=0;
j=0;
k=0;
for(i=1;i<=n;i++)
if((n%i)==0)
{
s[j]=i;
sum=sum+s[j];
j++;
}
if(sum==n)
{
printf("\n%d的因子数是:",n);
for(k=0;k<j;k++)
printf("%d",s[k]);
printf("\n");
}
}

}
...全文
2020 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ranran114 2011-07-19
  • 打赏
  • 举报
回复
sum=sum+s[j];
哪位可以帮我解释下这一步是什么意思。。初学者见笑了~
很笨的菜鸟 2011-05-28
  • 打赏
  • 举报
回复
#include<stdio.h>
main()
{
int m;
int i,k,s=0;
for(m=2; m<1000; m++)
{
for(i=1; i<=m/2; i++)
if(m%i==0)
{
k=i;
s+=k;
}
if(s==m)
printf("%4d",m);
s=0;
}
printf("\n");
}
ailinguoqiang 2010-09-18
  • 打赏
  • 举报
回复
for(i=1;i <=n;i++)
if((n%i)==0)
{
s[j]=i;
sum=sum+s[j];
j++;
}
if(sum==n)
{
printf( "\n%d的因子数是: ",n);
for(k=0;k <j;k++)
printf( "%d ",s[k]);
printf( "\n ");
}
}

}
ailinguoqiang 2010-09-18
  • 打赏
  • 举报
回复
public class Wanshu
{ public static void main (String args[])
{ int s=0,i,j;
for (i=1;i<=1000;i++)
{
for(j=1;j<i;j++)
if(i%j==0)
s=s+j;
if(s==i)

System.out.println(""+i);
s=0;

}


}
}
windyfzz 2010-07-25
  • 打赏
  • 举报
回复
错误有一下几处:
1.int sun=0;
2.第2个for循还应改为for(i=1;i<n;i++)
3.在printf( "%d ",s[k]);后加上 sum=0;
4.int s[20]最好改为int s[100]或更大,尽量大点。
改完之后你再试试
Canvman 2010-07-04
  • 打赏
  • 举报
回复
class Wanshu
{
public static void main(String args[])
{
int x,i,sum;
for(x=1;x<=1000;x++)
{
sum=0;
for(i=1;i<x;i++)
{
if(x%i==0)
sum+=i;
}
if(x==sum) System.out.println(x+"是完数");
}
}
}
clywind 2008-06-28
  • 打赏
  • 举报
回复
for(i=1;i <=n;i++) -------------这里的i<=n不正确 要改成 i<n
if((n%i)==0)
{
s[j]=i;
sum=sum+s[j];
j++;
}
可能你没看清楚完数的定义,因子里面不能有自身,比如1000以内的完数只有6,28,496,
拿6来说。如果按照你的算法就是这样 6的因子 1,2,3,6 你加起来的和就是1+2+3+6是6的2倍 而不是6
所以要把自身去掉,所以这里要把=去掉 改成i<n
还有楼上说的如果把2处改为2*n 会有潜在的错误,具体结果你自己可以运行一下。过程太复杂,一两句话说不清楚
总之用C语言一切要从简,里面好多BUG。给你个最简单的程序
#include <Stdio.h>
void main()
{
int m,i,s;
for(m=1;m<=1000;m++)
{
s=0;
for(i=1;i<m;i++)
if(m%i==0)
s=s+i;
if(s==m)
printf("%d,",s);
}
}
完数还有个性质 古希腊数学家欧几里发现所有完数都满足 2^(n-1)*(2^n-1) 表达式

当 n = 2^1*(2^2-1) = 6
当 n = 2^2*(2^3-1) = 28
当 n = 2^4*(2^5-1) = 496
当 n = 2^6*(2^7-1) = 8128
C语言里 a^b 是用pow(a,b)表示,通过以上提示你可以找到更方便的方法
要求是1000以内 只要判断几个数就可以了 对电脑来说 减少的工作量可是天文数字 爱惜电脑 一切从简 偶的箴言
venuschenxi 2007-06-13
  • 打赏
  • 举报
回复
ayw215(松花鼠)已经指出了错误了.
for(i=1;i<=n;i++)----1
if((n%i)==0)
{
s[j]=i;
sum=sum+s[j];
j++;
}
if(sum==n)-------2

要么在1处改为n/2
要么在2处改成n*2
在1处,判断条件i<=n,当i==n时n%i==0成立,则s[j]=n;即便那个数是完数根据后面的判断if(sum==n)也绝对不成立.如6=1+2+3,但是按LZ的程序,s[0]=1,s[1]=2,s[2]=3,s[3]=6;
sum=1+2+3+6=12=2*6,这也是ayw215(松花鼠)指出不改1处改2处为2*n的原因.
xfr_1982 2007-06-13
  • 打赏
  • 举报
回复
说出我错误的高手,我给他全分,谢谢了!!!真是着急,不知道自己错在哪里???
xfr_1982 2007-06-13
  • 打赏
  • 举报
回复
能说明我的错误在哪里吗??谢谢各位高手了!!
Inhibitory 2007-06-12
  • 打赏
  • 举报
回复
#include <stdio.h>
void main(){
int n;
int i;
int j=0;
int k;
int sum;
int s[200];

for(n=2;n<=1000;n++)
{
sum=0;
j=0;
k=0;
for(i=1;i<n;i++) // 你的程序这里是for (i = 1; i <= n; i++)
if((n%i)==0)
{
s[j]=i;
sum=sum+s[j];
//printf("%d",s[j]);
j++;

}

if(sum==n)
{
printf("\n%d的因子数是:",n);
for(k=0;k<j;k++)
printf("%d ",s[k]);
printf("\n");
}
}
}
bargio_susie 2007-06-12
  • 打赏
  • 举报
回复
for(i=1;i<=n;i++)
——————————————
for(i=1;i<n;i++)
ayw215 2007-06-12
  • 打赏
  • 举报
回复
for(i=1;i<=n;i++)----1
if((n%i)==0)
{
s[j]=i;
sum=sum+s[j];
j++;
}
if(sum==n)-------2

要么在1处改为n/2
要么在2处改成n*2

----------
给个正确的你看看

#include <stdio.h> /*头文件*/
#define N 1000
int wanshu(int x) /*判断x是否完数*/
{
int i,sum=0;
// int factor[N]={0};

for(i=1;i<=x;i++) /*对所有x的因子求和*/
{
if(x%i==0) sum=sum+i;
continue;
}

if(sum==x*2) return(1); /*如果求和结果等于2x则x是完数*/
else return(0); /*否则不是完数*/
} /*完数判断函数结束*/

int print_factor(int x) /*打印结果*/
{
int i,j,res[1000]={0}; /*i,j为循环变量.res数组记录每个因子.*/

for(i=1;i<x;i++) /*将每个非零因子存在数组res[]中*/
{
if(x%i==0) res[i]=i;
continue;
}

printf("%d its factors are: ",x); /*打印提示*/

for(j=0;j<x;j++) /*打印每个因子,以逗号相隔.*/
{
if(res[j]!=0)
{
printf("%d",res[j]);
printf("\,");
}
}
printf("\n");

return(0);
} /*打印函数结束*/

int main(int argc, char *argv[]) /*主函数*/
{
int i; /*循环变量*/

for(i=1;i<=N;i++) /*循环找出小于N的所有完数并输出其因子.*/
{
if(wanshu(i))
print_factor(i);
continue;
}

return 0;
} /*主函数结束*/


iambic 2007-06-12
  • 打赏
  • 举报
回复
不太懂什么是完数。
fan690265281 2007-06-12
  • 打赏
  • 举报
回复
接分
yhongz1 2007-06-12
  • 打赏
  • 举报
回复
长知识,接分
jixingzhong 2007-06-12
  • 打赏
  • 举报
回复
题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程
   找出1000以内的所有完数。

程序源代码:
#include "stdio.h"
int main()
{
static int k[10];
int i,j,n,s;
for(j=2;j<1000;j++)
{
n=-1;
s=j;
for(i=1;i<j;i++)
{
if((j%i)==0)
{
n++;
s=s-i;
k[n]=i;
}
}
if(s==0)
{
printf("%d is a wanshu",j);
for(i=0;i<n;i++)
printf("%d,",k[i]);
printf("%d\n",k[n]);
}
}
getchar();
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧