Умножение и увеличение способностей - PullRequest
0 голосов
/ 29 декабря 2018

Идея такова: http://prntscr.com/m0xopk, он отлично работает, кроме 5, когда я даю 5, он рассчитывает неправильно. Я не могу понять, почему?

int i,a,n;
int sum = 1;

scanf("%d",&a);
scanf("%d",&n);


for(i = 1;i <= n;i++){
     sum *=pow(a,i);

}
printf("%d",sum);

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Целые числа не могут вместить столь большие числа.Вместо этого вам нужно использовать числа с плавающей точкой.

double calc(double a, int i)
{
    double sum = 1;

    for(int p = 1; p <= i; p++)
    {
        sum *= pow(a,i);
    }
    return sum;
}
0 голосов
/ 29 декабря 2018

Он отлично работает, кроме 5, когда я даю 5, он неправильно рассчитывает

Нет, он отлично работает для значений меньше , чем 5.Когда вы вводите 5 для a и n, результирующее число суммирования будет 30517578125, что является большим значением для переменной типа 32 bit int.Вместо этого вы должны использовать переменную типа uint64_t.

Кроме того, вы не должны использовать функцию pow() для целочисленного типа.Проверьте это .

Вы можете сделать:

#include <stdio.h>
#include <inttypes.h>

int main()
{
    int i, a, n;
    uint64_t num = 1, result = 1;;

    printf ("Enter a: \n");
    scanf("%d",&a);
    printf ("Enter n: \n");
    scanf("%d",&n);

    for(i = 0;i < n;i++){
        num = num * a;
        result = num * result;
    }

    printf("result: %"PRId64"\n", result);

    return 0;
}

Обратите внимание, что это 64 битовое решение также имеет ограничение и будет работатьдля ввода 5, но не может быть для числа, немного превышающего 5.Если вы хотите произвольно большое число, отметьте это .

...