繁体   English   中英

C:大整数的表示

[英]C: Representation of Big Integers

所以,假设我已经创建了一个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 )并返回mod。 您还可以通过使用覆盖其参数的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; }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM