Zeeking99 Ответов: 2

Нахождение наибольшего простого множителя числа с помощью программы на языке Си


Я написал код, который принимает число в качестве входных данных и отображает его наибольший простой множитель. Программа прекрасно работает до 9-значных чисел. После 9-значных чисел он ведет себя странно, показывая отрицательные числа.

#include<stdio.h>
 
int largestprimefactor(unsigned long a)
{
    int i =2 ,largeprimefactor = 2;
     
    while(a!=1)
    {
        if(a%i==0)
        {
            while(a%i==0)
            {
                a = a/i;
                 
                printf("%d ",i);
                 
                if(i>largeprimefactor)
                {
                    largeprimefactor = i;
                }
            }
        } 
         
        i++;
    }
     
    return largeprimefactor;
}
 
main()
{
    unsigned long inputnumber;
     
    printf("Enter a number : ");
    scanf("%d",&inputnumber);
     
    printf("\nThe largest prime factor of %d is %d",inputnumber,largestprimefactor(inputnumber));
}


Что я уже пробовал:

Я подумал, что это может быть проблема с типом данных, поэтому попробовал использовать unsigned long long, но это не помогло.

2 Ответов

Рейтинг:
20

User 7429338

В то время как inputnumber является длинным, ваш scanf все еще ожидает только целое число. Вы можете принять неподписанный длинный вот так:

unsigned long inputnumber;
scanf("%lu",&inputnumber);

Или без подписи долго-долго:
unsigned long long inputnumber;
scanf("%llu",&inputnumber);

Для справки о форматах см. ссылка на scanf - C++ [^]

При отображении результата необходимо соответствующим образом изменить формат printf.


Zeeking99

Спасибо, что это работает.

Рейтинг:
2

Patrice T

Цитата:
Нахождение наибольшего простого множителя числа с помощью программы на языке Си

Если вы введете 1, Ваша программа скажет, что наибольший простой множитель равен 2. Я подозреваю ошибку.
Вам также нужно обработать результат для 0 и отрицательных чисел, чтобы быть полным.

Вы можете упростить свой код
while(a!=1)
{
    if(a%i==0) // you can remove the test because
    {
        while(a%i==0) // the condition is the same
        {
            a = a/i;

            printf("%d ",i);

            if(i>largeprimefactor)
            {
                largeprimefactor = i;
            }
        }
    }

    i++;
}

[Обновление]
Вы можете даже упростить больше.
while(a!=1)
{
    if(a%i==0) // you can remove the test because
    {
        while(a%i==0) // the condition is the same
        {
            a = a/i;

            printf("%d ",i);

            if(i>largeprimefactor)  // because i is never lower than largeprimefactor
            {
                largeprimefactor = i;
            }
        }
    }

    i++;
}


nv3

Я сомневаюсь, что это сработает, если вы оставите i++ вне цикла :-)

Patrice T

Прочтите код более внимательно. :)

nv3

Понял. Извиняюсь.

Patrice T

Пожалуйста :)

Zeeking99

Иногда я меньше, чем большой преступник.

Patrice T

Никогда. Используйте отладчик, чтобы увидеть это самостоятельно.
Просто прочитав ваш код, я могу гарантировать вам, что я никогда не буду меньше, чем largeprimefactor

Zeeking99

Да, вы правы. Прости, что ошибся.

Patrice T

Не извиняйся, все когда-то были новичками.
Будьте счастливы, что вы чему-то научились.
Если у вас есть попытка отладчика, это самая полезная вещь, которую вы узнали сегодня.

Zeeking99

Да