即使我使用%1000000007,它仍然会导致0

时间:2018-03-28 22:59:55

标签: c

我对此代码的目标是在没有pow()的情况下进行指数运算。 它适用于evey值a ^ b,其中b <= 30.我意识到我应该使用x%1000000007来防止整数溢出。

#include <stdio.h>
    int main(void) {
        int i, a, b, rst;
        rst = 1;
        scanf("%d %d", &a, &b);
        for (i = 0; i < b; i++){
            rst = rst * a;
            if( b == 0){
                rst = 1;
            }           
        }
        printf("%d\n", rst % 1000000007);
        return 0;
    }

为什么它会返回&#34; 0&#34;例如on&#34; 2 ^ 40%1000000007&#34;即使我使用%1000000007?

1 个答案:

答案 0 :(得分:1)

首先,你不需要if语句for for循环。
第二,你试图在已经发生整数溢出后停止它。所以你需要在每次乘法运算后都这样做 第三次,您可以使用unsigned long long int代替int,因为int取决于机器(对于您机器上的int,可能1000000007太大了)。

我想这应该有效:

#include <stdio.h>

int main()
{
    unsigned long long int i, a, b, rst;

    scanf("%llu %llu", &a, &b);

    rst = 1;
    for (i = 0; i < b; i++){
        rst = (rst * a) % 1000000007;
    }
    printf("%llu\n", rst);

    return 0;
}