注册 登录
编程论坛 C语言论坛

输入正整数n(n>1),编程找出n以内的所有完数并输出其因子。

opq2020 发布于 2020-04-13 16:13, 5409 次点击


输入格式:1000

输出格式:6(1,2,3);28(1,2,4,7,14);496(1,2,4,8,16,31,62,124,248);(注意:式子中所有符号均为英文状态下的符号)
*/
3 回复
#2
lin51616782020-04-13 16:17
遇到什么问题说清楚
论坛不支持抄代码
#3
自学的数学2020-04-13 16:34
程序代码:
#include<stdio.h>
main()
{
int n,i,j,k=0,sum=0,a[100];
printf("请输入一个数字\n");
scanf("%d",&n);
for(i=1;i<=n;i++)
  {
   sum=0;
   k=0;
   for(j=1;j<i;j++)
    {
      if(i%j==0)
      {
        a[k++]=j;
        sum+=j;
      }
    }
    if(sum==i)
     {
      printf("%d",j);
      printf("(");
      while(k--)
      printf("%d, ",a[k]);
      printf(")");
      printf("\n");
    }
  }
  printf("\n");
}
#4
D22845814702020-04-13 21:21
你好!
这道题主要在于格式的输出,判断的话可以想得简单一点,总体思路:从2 开始一直到输入的界限(比如1000),然后对每一个数求它的因子,总求它的和,进行判断,如果这个数和总和相等的话,在进行下面的输出代码。期间在前面用了计数,这是为了更好的在格式输出时便于控制。
下面是代码:(有注释)
程序代码:
#include<stdio.h>
int main()
{
    int i, j;
    int sum;//求所有因子的和
    int n;//输入一个数的范围 比如:1000
    int count,count1;//count 用于控制某个数的因子的个数 count1用于计数
    scanf("%d",&n);
    for (i = 2; i <= n; i++)//首先排除输出没有1 可以直接略去

    {
        count1 = 0;
        count = 0;
        sum = 0;//这三个赋值为0 的是每次循环数时重新赋值
        for (j = 1; j < i; j++)
        {
            if (i % j == 0)
            {
                sum += j;//计算因子的和
                count++;//计算因子的个数
            }
        }
        if (sum == i)//当因子的和等于它对应的数时 才开始下面
        {
            printf("%d(",sum);
            for (j = 1; j < sum; j++)
            {
                if (sum % j == 0)
                {
                    printf("%d",j);
                    count1++;
                    if (count1 == count)//为什么要计个数呢?主要是对最后一个格式的输出 不然多了 ,

                    {
                        printf(");");
                        break;
                    }
                    printf(",");
                }
            }
        }
    }
    return 0;
}
谢谢!!!
1