如何解决两个大数相乘得到错误结果
在下面的代码中乘以 p*q 时得到错误的结果:
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <time.h>
#include <stdbool.h>
#include <stdint.h>
#include <string.h>
#include <math.h>
uint32_t random_prime(void);
bool is_prime(uint32_t);
int main(void) {
srand((unsigned int) time(NULL));
uint32_t p = random_prime();
uint32_t q = random_prime();
while (p == q) {
q = random_prime();
}
uint64_t N = (uint64_t) p * q;
printf("\np = %"PRIo32"\n",p);
printf("q = %"PRIo32"\n",q);
printf("N = %"PRIo64"\n",N);
}
这是我得到的输出:
p = 27545553743
q = 24276636245
N = 742634106633630654517
这显然是错误的结果。我不认为这可能是溢出问题,因为 uint64_t 应该能够保存来自两个 uint32_t 的任何结果。 uint32_t 的最大值为 4294967295。4294967295^2 = 18446744065119617025。uint64_t 的最大值为 18446744073709551615,较大我不知道为什么我的输出可能是错误的。帮助?
解决方法
N 是正确的结果,因为您以八进制而不是基数 10 打印所有数字。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。