c - 即使我使用 % 1000000007 它仍然结果为 0

标签 c

我对这段代码的目标是在没有 pow() 的情况下进行指数运算。 它适用于每个值 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;
    }

为什么它会返回“0”,例如“2^40 % 1000000007”,即使我使用的是 % 1000000007?

最佳答案

首先,for循环中不需要if语句。
第二,您试图在整数溢出发生后阻止它。因此,您需要在每次乘法运算后执行此操作。
第三,可以使用unsigned long long int代替int,因为int是机器相关的(可能是1000000007对于您机器上的 int 来说太大了)。

我想这应该可行:

#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;
}

关于c - 即使我使用 % 1000000007 它仍然结果为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49545506/

相关文章:

c - 优化C中的这个Remove()方法

c - 为什么 C readdir 手册页说不要在静态分配的结果结构上调用 free

c - x86 asm 崩溃的应用程序

c - 如何让 gdb 以十六进制模式打印出所有值?

c - 从 "char"到 "char *"的转换无效

c - 为什么 "for(;i<=10;i++)"有效但 "for(i=0;i<=10;;)"无效?

在指数和小数部分具有不同位数的格式之间转换

c - 使用逗号运算符将值传递给函数?

c - 如果数组中存在 0 到 n-1 范围内的所有元素,则返回 0 或 1 的函数,运行时间 O(n)

c - get_arg() 不能与wake_up() 一起使用