gpt4 book ai didi

C:大整数的表示

转载 作者:太空狗 更新时间:2023-10-29 17:24:17 24 4
gpt4 key购买 nike

那么,假设我创建了一个由 3 个 32 位整数组成的结构,充当 96 位整数。

typedef struct {
unsigned int x, y, z;
} Int96;

让我们假设 int x 是第一个要填充的整数。在它溢出之前,y 递增并且 x 刷新回 0。z 的功能类似,但会处理 y 的溢出。

我将如何着手打印存储在该结构中的值?当然,我不能在不导致系统溢出的情况下直接打印出完整的值。

最佳答案

第一步是为您的 Int96 编写通用算术例程:

void Add96(Int96 *a, const Int96 *b) {
// add b to a
a->x += b->x;
a->y += b->y;
a->z += b->z;
if (a->y < b->y) a->z++;
if (a->x < b->x && ++a->y == 0) a->z++; }
void Sub96(Int96 *a, const Int96 *b);
void Mul96(Int96 *a, const Int96 *b);
void Div96(Int96 *a, const Int96 *b);
void Mod96(Int96 *a, const Int96 *b);

用那些你可以写的:

void print96(const Int96 *val) {
Int96 ten = { 10, 0, 0 };
Int96 div = *val;
Int96 mod = *val;
Div96(&div, &ten);
Mod96(&mod, &ten);
if (div.x || div.y || div.z) print96(&div);
putchar('0' + mod.x); }

您可以通过编写一个 DivMod96uint 函数来提高效率,该函数在一个步骤中执行 div 和 mod,并采用 unsigned(而不是 Int96 ) 作为第二个参数并返回模组。您还可以通过使用覆盖其参数的 print96destructive 函数来避免每个数字的额外副本,并且让 print96 只是制作一个副本然后调用它:

void print96destructive(Int96 *val) {
unsigned mod = DivMod96ui(val, 10);
if (val->x || val->y || val->z) print96destructive(val);
putchar('0' + mod); }
void print96(const Int96 *val) {
Int96 v = *val;
print96destructive(&v); }

unsigned DivMod96ui(Int96 *a, unsigned b) {
unsigned mod = a->z % b;
a->z /= b;
uint64_t y = a->y + ((uint64_t)mod << 32);
mod = y % b;
a->y = y / b;
uint64_t x = a->x + ((uint64_t)mod << 32);
mod = x % b;
a->x = x / b;
return mod; }

关于C:大整数的表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26105961/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com