C语言网

 找回密码
 加入社区!

QQ登录

只需一步,快速开始

查看: 932|回复: 7

这个判断完数的程序哪里错了??为什么不显示? [复制链接]

Rank: 1

主题
0
帖子
4
C币
7 枚
在线时间
0 小时
发表于 2010-1-25 18:12:17 |显示全部楼层
分享到:
完数就是一个数的所有因子之和等于其本身,这个程序时输出2--n 之间的完数,n是由键盘读入一个数字
#include <stdio.h>
#include <stdlib.h>
#define N 50
main()
{
      int a,b,c,d,e;
      int n,f,g[N];
      int sum;
      sum=0;
      b=0;c=0;d=0;e=0;
      printf("请输入一个数字:");
      scanf("%d",&n);
      for(a=2;a<=n;a++)
      {
                       for(c=1;c<a;c++)
      
           {
                       if(a%c==0)
           g[d++]=c;}
      
   
         for (f=0;f<=d;f++)
         sum+=g[f];
         if(sum==a)
        {
                   printf("%-3d",a);
         e++;
         if(e%5==0)
         printf("\n");
         }
         
         }
        
        system("pause");
         }
思路是先输入一个区间。然后拿数给他除,若是因子就放到数组里。不是就舍弃。最后相加,然后用SUM同原来的数比较,看看是否相等,相等就输出。不相等就继续循环

Rank: 1

主题
0
帖子
1
C币
1 枚
在线时间
0 小时
发表于 2010-1-31 19:35:16 |显示全部楼层
由于你的代码太混乱了,我实在不知道如何修改,给一段我写的好了
#include <stdio.h>

int main(void){
        int num = 0;
        int counting = 0;
        int factor_sum = 0;
        int end = 0;

        printf("请输入所求完全数的结束范围:\n");
        scanf("%d", &end);

        printf("2--%d 之间的完全数有:\n", end);
        for(num=2; num<=end; num++){
                for(counting=1, factor_sum=0; counting<num; counting++){
                        if(num % counting == 0){
                                factor_sum += counting;
                        }
                }
                        if(factor_sum == num){
                                printf("%d\t", num);
                        }
                }
        printf("\n");

        return 0;
}

Rank: 1

主题
0
帖子
17
C币
17 枚
在线时间
1 小时
发表于 2010-2-4 10:52:05 |显示全部楼层
楼主你好,你的代码有一点问题 就是for (f=0;f<=d;f++)这地方错了:首先数组元素从零开始,所以本应该是f<d,但是由于你上一行执行完以后又实现了d++,所以,只要把for (f=0;f<=d;f++)中的f<=d改成f<d-1就okl了!!试试吧!另外应该注意整理一下哦!

Rank: 1

主题
0
帖子
2
C币
2 枚
在线时间
0 小时
发表于 2010-2-10 17:30:40 |显示全部楼层
同意楼上的观点

Rank: 1

主题
0
帖子
3
C币
3 枚
在线时间
0 小时
发表于 2010-2-10 19:16:54 |显示全部楼层
我把你的程序稍加修改:
存储中间数据的数组扩容,<=改为<,循环一次后将某些变量再次初始化,去掉了最后那个作用不大的循环,
修改后如下:
#include <stdio.h>
#include <stdlib.h>
#define N 1000
main()
{
      int a,b,c,d,e;
      int n,f,g[N];
      int sum;
      sum=0;
      g[0]=0;
      b=0;c=0;d=0;e=0;
      printf("input n=");
      scanf("%d",&n);
      for(a=2;a<=n;a++)
      {
                for(c=1;c<a;c++)
                {
                if(a%c==0)
                g[d++]=c;}
                for(f=0;f<d;f++)
                sum+=g[f];
                if(sum==a)
                printf("%-3d\n",a);
         d=0;
         sum=0;
         }

        system("pause");
         }

运行检验时,
输入 n=1000  时,程序输出 6   28   496
输入 n=10000时,程序输出 6   28   496    8128
(6和28是正确的,496和8128我没验算,请楼主验算并跟帖说明正确否)

Rank: 1

主题
0
帖子
10
C币
10 枚
在线时间
2 小时
发表于 2010-2-18 18:52:20 |显示全部楼层
只能说各位有点把简单问题复杂化!

Rank: 2

主题
0
帖子
1
C币
85 枚
在线时间
4 小时
发表于 2012-3-24 10:59:31 |显示全部楼层
首先在时间和空间上可以改进很多。在求数n的因子是循环只需到sqrt(n);还有n的因子不需要用数组存起来,直接加给sum。
int sum=0;
for(int i=2;i*i<=n;i++)
{
if(n%i==o)
{
sum+=i+n/i;
}
}
if(sum==n)
{
printf("%d",sum);
}

Rank: 1

主题
0
帖子
1
C币
13 枚
在线时间
0 小时
发表于 2012-3-24 13:27:55 |显示全部楼层
呵呵
您需要登录后才可以回帖 登录 | 加入社区!

C语言 ( 粤ICP备11042647号-2 )

GMT+8, 2012-5-20 17:26

©2009-2011 cyuyan.com.cn

回顶部