黑马程序员技术交流社区

标题: 完数的题,求大神指点:结果为什么不正确 [打印本页]

作者: 仁清    时间: 2015-6-15 21:19
标题: 完数的题,求大神指点:结果为什么不正确
#include<stdio.h>
int main()
{
        int i,j;
        for(int i=6;i<1000;i++)
        {
                int sum=1;
                for(j=2;j<i;j++)
                {
                        if(i%j==0)
                                sum+=j;
                        if(sum==i)
                                printf("%d\n",i);
                }               
        }
        return 0;
}


作者: 白0702    时间: 2015-6-15 21:42
这个程序里,j初始值应该为1,sum初始值应该为0,另外你打印应该在次循环完成后进行。下面是调试正确的程序:
#include<stdio.h>
int main()
{
        int i,j;
        for(i=6;i<1000;i++)
        {
                int sum=0;
                for(j=1;j<=(i/2);j++)
                {
                        if(i%j==0)
                           sum+=j;
                        
                }   
                        if(sum==i)
                        printf("%d\n",i);
        }
        return 0;
}
作者: 仁清    时间: 2015-6-15 21:49
白0702 发表于 2015-6-15 21:42
这个程序里,j初始值应该为1,sum初始值应该为0,另外你打印应该在次循环完成后进行。下面是调试正确的程序 ...

哦,原来是打印的地方出问题了,谢谢~
但是
sum=1,和j=2是一组
sum=0和j=1是一组
作者: 白0702    时间: 2015-6-15 21:53
仁清 发表于 2015-6-15 21:49
哦,原来是打印的地方出问题了,谢谢~
但是
sum=1,和j=2是一组

sum肯定是要初始化为0的,j也应该初始化为1,因为1也是它的公约数啊。
作者: 仁清    时间: 2015-6-15 21:56
白0702 发表于 2015-6-15 21:53
sum肯定是要初始化为0的,j也应该初始化为1,因为1也是它的公约数啊。

#include<stdio.h>
int main()
{
        int i,j;
        for(i=6;i<1000;i++)
        {
                int sum=1;
                for(j=2;j<i;j++)
                {
                        if(i%j==0)
                           sum+=j;
                        
                }   
                        if(sum==i)
                        printf("%d\n",i);
        }
        return 0;
}
你运行,试试,对不对
作者: 白0702    时间: 2015-6-15 22:15
仁清 发表于 2015-6-15 21:56
#include
int main()
{

这样写也正确,因为1是每个数的公约数,刚才没仔细看。共同学习了
作者: aofex    时间: 2015-6-15 22:16
这是啥题啊    貌似很难啊
作者: fixer    时间: 2015-6-15 22:41
完数是什么?
作者: cxl19900517    时间: 2015-6-15 22:55
//函数定义在main函数后,
int wanShu(int n);

int main()
{
    printf("0 ~999 中 完数为\n");
   
    //遍历 1 ~ 999
    for (int n = 1 ; n <= 999; n ++) {
        //通过调用函数,判断 各个数值是否是完数
        int result = wanShu(n);
        
        //如果数值是完数,打印显示
        if (result) {
            printf("%d\n", n);
        }
        
    }
   
    return 0;
}

//定义一个函数,计算数值是否是完数
int wanShu(int n)
{
    //定义一个变量,用来计算各因子的和
    int sum = 0;
    //遍历 0 ~n
    for (int i = 1; i < n; i ++) {
        //通过取模计算出 i 是否是 n 的因子
        if (n % i == 0) {
            //将 因子 i 累加到 sum 中
            sum += i;
        }
    }
   
    //判断 各因子的和 是否等于 n 并返回 值 方便main 函数调用时判断
    if (sum == n) {
        return 1;
    } else{
        return 0;
    }
   
}
作者: 小小羊    时间: 2015-6-15 23:18
这个已经运行过了,完全可以
#include<stdio.h>
int main()
{
   int a,i,b=0;                  //a为1~999之间的数,i为1~a之间的数,b为数a的因子之和
   for(a=1;a<1000;a++)      
      {  
         for(i=1;i<a;i++)
            {
                if(a%i==0)       //若数a除以i余数为零,则因子相加
                                b=b+i;
             }
          if(b==a)               //数a的因子之和等于数a,则数a为完数
          printf("%d是完数\n",a);
          b=0;                     //重置b的值
        }

   return 0;
}
作者: 这是829    时间: 2015-6-15 23:51
围观学习啦,大家加油啊!!!

作者: lipeng524824    时间: 2015-6-16 00:08
围观,学习学习!
作者: fanxing    时间: 2015-6-16 08:45
看了一下,大家很努力啊
作者: 丁铭检    时间: 2015-6-16 09:06
围观学习,随便偷一点经验。。。
作者: aludiba    时间: 2015-6-16 09:54
打印的地方错了,把printf函数写在第二个for循环里面,会出现两个错误,首先会在这个for循环结束之前重复打印此前已经满足第二个if条件的结果;再者有可能会将盈数打印出来,这段代码打印出了一个盈数24。
将第二个if条件语句写在第二个for循环外面第一个for循环里面就好了,楼主的代码写的还是挺精简的。
作者: 仁清    时间: 2015-6-16 17:08
fixer 发表于 2015-6-15 22:41
完数是什么?

完数是一个数等于它的所有因子之和




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2