Ищем сумму факторов, равную количеству себя - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь закончить домашнее задание, пока меня что-то затянуло.

Здесь вопрос: в диапазоне N выведите те числа, сумма факторов которых равна им самим, в следующем формате.

Ввод:

1000

вывод:

6 its factors are 1 2 3 
28 its factors are 1 2 4 7 14 
496 its factors are 1 2 4 8 16 31 62 124 248 

Вот мой код, пожалуйста, скажите мне, почему я не могу получить правильный вывод.Цените это, если вы можете улучшить это для меня.

Заранее спасибо.

#include<stdio.h>
#define NUM 100
int main()
    {
    int goal[NUM];//array for factors.
    int N;
    scanf("%d",&N);
    getchar();
    for(int p=2;p<N;p++)//1 and N are not included.
     {
        int j=0,sum=0;
        for(int i=1;i<p; )
        {
            //get factors and put them into array.
            while(p%i==0)
            {
                goal[j]=i;
                sum+=goal[j];
                j++;
                i++;
            }
        }
        //judge the sum of factors and p the two values are equal.
        if(sum==p)
        {
            printf("%d its factors are ",p);

            for(int i=0;i<j;i++)
            {
                while(i==j-1)
                printf("%d \n",goal[i]);
            }
        }
    }
    return 0;

}

1 Ответ

1 голос
/ 25 сентября 2019

Делая то же самое немного чистым,

int main()
{
    int N, factors_sum, factors_cnt, num, j;

    scanf("%d", &N);

    int *factors = malloc(sizeof(int) * N/2);

    if (factors == NULL)
    {
        perror("malloc(2)");
        return 1;
    }

    for (num = 2 ; num < N ; ++num)
    {
        factors_cnt = 0;
        factors_sum = 0;
        for (j = 1 ; j <= num/2 ; ++j)
            if (num % j == 0)
                factors_sum += (factors[factors_cnt++] = j);

        if (factors_sum == num)
        {
            printf("%d its factors are", num);
            for (j = 0 ; j < factors_cnt ; ++j)
                printf(" %d", factors[j]);
            printf("\n");
        }
    }
    free(factors);
    return 0;
}

Изменения сохраняют ваш код:

#include<stdio.h>
#define NUM 100
int main()
    {
    int goal[NUM];//array for factors.
    int sum=0;
    int N;
    scanf("%d",&N);
    //getchar(); // I donno why you need this, better to remove it
    for(int p=2;p<N;p++)//1 and N are not included.
    {
        // sum is different for every number
        // need to be set to 0 individually for every number
        sum = 0; 
        int j=0;
        for(int i=1;i<p; i++) // i++ everytime
        {
            //get factors and put them into array.
            if (p%i==0)
            // changed while to if
            // while would keep executing forever
            {
                goal[j]=i;
                sum+=goal[j];
                j++;
            }
        }
        //judge the sum of factors and p the two values are equal.
        if (sum==p)
        {
            printf("%d its factors are ",p);

            for(int i=0;i<j;i++)
            {
                // no need for while here
                printf("%d \n",goal[i]);
            }
        }
    }
    return 0;

}

Я внес изменения в ваш код и исправил / прокомментировал, где вы допустили ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...