C 即使我使用了%100000007,它仍然会在0上产生结果

C 即使我使用了%100000007,它仍然会在0上产生结果,c,C,我在这段代码中的目标是在没有pow()的情况下进行指数运算。 它适用于每个值a^b,而b首先是该值,您不需要for循环中的if语句。 第二个,您正在尝试在整数溢出发生后停止它。因此,您需要在每次乘法运算后执行此操作。 第三个,您可以使用无符号长整型而不是整型,因为整型依赖于机器(可能是1000000007对于您机器上的整型而言太大) 我想这应该行得通: #include <stdio.h> int main() { unsigned long long int i, a,

我在这段代码中的目标是在没有pow()的情况下进行指数运算。
它适用于每个值a^b,而b首先是该值,您不需要for循环中的if语句。
第二个,您正在尝试在整数溢出发生后停止它。因此,您需要在每次乘法运算后执行此操作。
第三个,您可以使用
无符号长整型
而不是
整型
,因为
整型
依赖于机器(可能是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;
}
#包括
int main()
{
无符号长整型i,a,b,rst;
scanf(“%llu%llu”、&a和&b);
rst=1;
对于(i=0;i
您的
%1000000007
背后的逻辑是什么?这个数字是从哪里来的?如果系统上的
int
为32位,则它不能容纳2**40的值。尝试添加一个
printf
调用,或使用调试器跟踪循环前后的
rst
值。快速谷歌搜索表明
%100000007
在编程竞赛中很常见:问题是在循环32次后,
rst
中的值为0。这是因为2^32 mod 2^32=0。对于
int
(小于32位)来说,它可能不是太大的
100000007
。这是
rst
@KeithThompson,但是先生,我认为
rst
不会超过
100000007
。或者我遗漏了什么?循环计算
a**b
(a提升到b次方)。OP使用的示例为2**40。您的修改版本通过在每一步应用
%100000007
来避免溢出。@KeithThompson,那么您是说我的代码打印了错误的答案(511620083)?我不是在说您的代码。我是说,在OP的代码中,对于
int
来说,它不是
100000007
太大,而是
rst
a
b
分别是
2
40
时。
#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;
}