C和Python中的指数给出了不同的答案



尝试做费马小定理,注意到它在C语言中不起作用,所以我在Python中尝试了它,它工作正常。

费马小定理

https://mathworld.wolfram.com/FermatsLittleTheorem.html

答案应该给我 1 分,但我得到 13 分。

Python 指数(工作(

prime_num = 13**(17-1)
>665416609183179841
prime_num%17 = 1

C 指数(不工作(

double prime_num = pow(13,17-1)
>665416609183179904
fmod(prime_num,17) = 13

在 C 中,pow(( 函数获取并返回双精度浮点值,这些值是近似值。

在 Python 中,** 运算符使用 Python 整数执行操作,大小增加(用于保存值的内存(。 如果您在操作之前强制将数字作为浮点数,您可能会得到相同的结果。

在 C 中,您可以尝试编写一个与 uint64_t(无符号长长(一起使用的不同幂函数,看看它是否有效。

如果你想要精度,你需要使用long long。 问题是没有pow,所以它归结为简单的乘法。

long long n, val;
int ii;
n = 13LL;
val = n;
for (ii = 2; ii < 17; ++ii)
val *= n;
printf("%lldn", val);
printf("%lldn", val % 17LL);
问题是我应该使用powl()

它返回长双精度而不是双精度,我也应该使用fmodl()它返回具有长双精度类型的其余部分。

C 代码工作

long double prime_num = powl(13,17-1);
>665416609183179841
fmodl(primen_num,17);
>1

最新更新