求1000以内的完数,自己的程序感觉写的没有问题,但是不出结果,大侠伸伸手啊!
附代码:
#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 ");
}
}
}
[解决办法]
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;
} /*主函数结束*/
[解决办法]
#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 ");
}
}
}
[解决办法]
题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如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();
}
------解决方案--------------------
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的原因.