A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

#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;
}

15 个回复

倒序浏览
这个程序里,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;
}
回复 使用道具 举报
白0702 发表于 2015-6-15 21:42
这个程序里,j初始值应该为1,sum初始值应该为0,另外你打印应该在次循环完成后进行。下面是调试正确的程序 ...

哦,原来是打印的地方出问题了,谢谢~
但是
sum=1,和j=2是一组
sum=0和j=1是一组
回复 使用道具 举报
仁清 发表于 2015-6-15 21:49
哦,原来是打印的地方出问题了,谢谢~
但是
sum=1,和j=2是一组

sum肯定是要初始化为0的,j也应该初始化为1,因为1也是它的公约数啊。
回复 使用道具 举报
白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;
}
你运行,试试,对不对
回复 使用道具 举报
仁清 发表于 2015-6-15 21:56
#include
int main()
{

这样写也正确,因为1是每个数的公约数,刚才没仔细看。共同学习了
回复 使用道具 举报
aofex 中级黑马 2015-6-15 22:16:56
7#
这是啥题啊    貌似很难啊
回复 使用道具 举报
fixer 中级黑马 2015-6-15 22:41:16
8#
完数是什么?
回复 使用道具 举报
//函数定义在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;
    }
   
}
回复 使用道具 举报
这个已经运行过了,完全可以
#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;
}
回复 使用道具 举报 1 0
围观学习啦,大家加油啊!!!
回复 使用道具 举报
lipeng524824 来自手机 中级黑马 2015-6-16 00:08:00
12#
围观,学习学习!
回复 使用道具 举报
看了一下,大家很努力啊
回复 使用道具 举报
围观学习,随便偷一点经验。。。
回复 使用道具 举报
打印的地方错了,把printf函数写在第二个for循环里面,会出现两个错误,首先会在这个for循环结束之前重复打印此前已经满足第二个if条件的结果;再者有可能会将盈数打印出来,这段代码打印出了一个盈数24。
将第二个if条件语句写在第二个for循环外面第一个for循环里面就好了,楼主的代码写的还是挺精简的。
回复 使用道具 举报

完数是一个数等于它的所有因子之和
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马