0

我是一名试图闯入 C 语言的 Python 程序员。有人能帮我理解这种意想不到的行为吗?

#include <stdio.h>
#include <stdlib.h>

int modulo(int a, int b) {
    return a - b * (a / b);
}

int main(int argc, char **argv) {
    printf("The largest possible LLu is %llu.\n", -1LLu);
    unsigned long long x = atoi(argv[1]);
    unsigned long long i;
    printf("Finding the largest prime number less than %llu.\n", x);
    for(i = 2; i < (x / 2) + 1; i ++) {
        if(modulo(x, i) == 0) {
             i = 2;
             x--;
        }
    }
    printf("Found %d.\n", (int)x);
return(0);
}

然后在终端上:

./编 111111111189

最大可能的 LLu 是 18446744073709551615。

查找小于 18446744073151513109 的最大素数。

然而,对于一些非常大的数字(仍然小于最大 LLu)和较小的数字,该程序按预期工作。

我很困惑!

非常感谢!

4

2 回答 2

1

atoi()返回int您在命令行输入的值会溢出int使用atoll(),或者甚至更好地使用更灵活且不像可以处理溢出的strtoll() :atoi()

atoll(argv[1]);
//or 
strtoll(argv[1], NULL, 10);
于 2012-12-24T11:53:15.487 回答
0

首先,C 有一个内置的模运算符,%. 没有理由自己做。

其次,您的模函数只接受int值,并atoi返回一个int. 因此,您的程序仅限于 a 的范围int,而不是unsigned long long.

最后,如果它按您预期的那样工作,那么您的预期就会被打破,因为它不会给出正确的输出,因为数字在整个地方都被截断了。

于 2012-12-24T11:48:50.913 回答