Вот программа для поиска факториала числа. Почему я получаю 0 в качестве ответа? Какой тип данных я должен использовать вместо этого?

Я не уверен, что вы можете явно исключить пакеты с помощью фильтра & lt; exclude-filter & gt ;, но я уверен, что использование фильтра регулярных выражений эффективно приведет вас туда:

 <context:component-scan base-package="com.example">
    <context:exclude-filter type="regex" expression="com\.example\.ignore\..*"/>
 </context:component-scan>

Чтобы сделать его аннотацией, вы должны аннотировать каждый класс, который вы хотели исключить для тестов интеграции, с чем-то вроде @ com.example.annotation.ExcludedFromITests. Тогда компонент-сканирование будет выглядеть так:

 <context:component-scan base-package="com.example">
    <context:exclude-filter type="annotation" expression="com.example.annotation.ExcludedFromITests"/>
 </context:component-scan>

Это понятно, потому что теперь вы сами документировали в самом исходном коде, что класс не предназначен для включения в контекст приложения для тестов интеграции.

1
задан machine_1 27 February 2019 в 14:07
поделиться

4 ответа

33! фактически является выходом за пределы 32-битного диапазона int, независимо от того, подписан он или нет. 12! имеет значение 479001600, а 13! имеет значение 6227020800, поэтому вы выходите за пределы диапазона 13!.

Обратите внимание, что result определяется как int, и вы возвращаете int из fact. Это означает, что вы получите целочисленное переполнение со знаком, которое вызывает неопределенное поведение . Это можно исправить, изменив тип обоих на unsigned, хотя вы все еще ограничены 12!.

Вместо этого вы можете попробовать использовать unsigned long long для своих типов. Это поднимет вас до 20!. Если вы хотите, чтобы значения были больше этого, вам нужно использовать библиотеку bigint, такую ​​как GMP.

0
ответ дан dbush 27 February 2019 в 14:07
поделиться

Факториал растет очень быстро . 13! уже находится вне диапазона, представляемого 32-разрядным целым числом без знака. Арифметика без знака возвращает остаток, когда результат не может быть представлен, то есть вы получаете только младшие биты истинного математического результата. Вы могли бы пойти немного выше, используя более широкий тип данных, но не намного. Вам нужен арифметический пакет произвольной точности и много памяти, чтобы идти гораздо дальше.

А почему вы получаете результат за 34! равно нулю , обратите внимание, что среди факторов 1 * 2 * 3 * ... * 33 * 34 есть 17, кратные двум, 8 из которых также кратны 4, 4 из которых также кратны 8, два из которых кратны 16, и один из которых равен 32. В общей факторизации математического результата это 32 32 с, поэтому остаток по модулю 2 32 равен нулю. [ 111]

0
ответ дан John Bollinger 27 February 2019 в 14:07
поделиться

Вы получаете 0, когда переполняете свои типы данных. Формально поведение при переполнении int является неопределенным . Если вы переключите последовательно на unsigned типы, то переполнение будет таким, что поведение будет соответствовать арифметическому модулю 2, возведенному в степень числа бит в вашем типе unsigned.

Поскольку большой факториал кратен степени 2, 0, как вы заметили, будет достигнут на удивительно малом входном сигнале.

0
ответ дан Bathsheba 27 February 2019 в 14:07
поделиться

Ваше предположение. Тип данных, который я использовал, имеет диапазон 0-4294967295. не является правильным. Вы определяете параметр ans как unsigned int с диапазоном 0-4294967295, но в своей функции факта вы используете int с диапазоном -2,147,483,648 to 2,147,483,647.

Таким образом, вы должны изменить свой код следующим образом:

#include<stdio.h>
#include<stdlib.h>
unsigned int fact(unsigned int n)
{
        unsigned int result;
        if(n==0 || n==1)
                result=1;
        else
                result=n*fact(n-1);
        return result;
}
int main()
{
        unsigned int n,ans;
        printf("Enter n:");
        scanf("%u",&n);
        ans=fact(n);
        printf("Factorial of %u:%u",n,ans);
}

Вы также можете использовать unsigned long long вместо unsigned int, который будет поддерживать большие числа и больше подходит для факторного вычисления.

#include<stdio.h>
#include<stdlib.h>
unsigned long long fact(unsigned int n)
{
        unsigned long long result;
        if(n==0 || n==1)
                result=1;
        else
                result=n*fact(n-1);
        return result;
}
int main()
{
        unsigned int n;
        unsigned long long ans;
        printf("Enter n:");
        scanf("%u",&n);
        ans=fact(n);
        printf("Factorial of %u:%u",n,ans);
}

Подробнее о типах данных и их диапазоне: https://www.tutorialspoint.com/cprogramming/c_data_types.htm

0
ответ дан Iman Kianrostami 27 February 2019 в 14:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: