【问题标题】:C: Convert big number from string to int modulo n [closed]C:将大数从字符串转换为整数模n [关闭]
【发布时间】:2016-03-21 06:59:41
【问题描述】:

我正在尝试将非常大的数字(>100 位)从字符串转换为 Zn 加法组(模 n)中的整数。 n 保证在标准 C int 范围内(比如 n=12345)。

atoi then "%" 的简单方法和 BigIntiger 在这里都不起作用。

有什么想法可以实现吗?

【问题讨论】:

  • 久经考验的逐位转换算法,再加上(a + b) mod n = ((a mod n) + (b mod n)) mod n,乘法也是如此。
  • 您唯一剩下的问题是您将要编写answer = ((answer * 10)%n + digit)%10;,并且如果 n > MAXINT/10,则乘法可能会溢出。 (如果 n 为 > MAXINT/2,即使通过重复添加 (answer+answer)%n 也会溢出)。
  • @MartinBonner,这是使用<cstdint>中具有显式大小的类型的充分理由
  • 你想用 C 还是 C++ 来做这个?它们不是同一种语言,可能有不同的解决方案。请选择一个。
  • 没关系,但没必要使用<cstdint> (C++) 或stdint.h (C) 类型。所有标准整数类型(charshortintlongunsignedlong long 等)都具有最小范围保证 - 尽管允许实现支持比要求的标准。如果您知道n 的上限,请选择一种保证能够表示至少两倍该值的类型。如果n 对于标准类型来说太大了,请查找“大整数”库类型或类似的东西。

标签: c++ c type-conversion algebra abstract-algebra


【解决方案1】:

我假设您在问题中指的是 C++(没有 C/C++ 之类的东西)。 atoi 将字符串转换为可以放入标准整数(32 位)的数字,因此这不是您想要的。您必须编写自己的转换函数。

为了简单起见,我们假设您的数字是正数。首先注意模数下的加法和乘法与没有模数下的加法和乘法是等价的。所以我们只需要保留这两个操作的结果,即模数 n。然后注意我们可以逐位构造大数:

unsigned int convert(const char* s, int n) {
    long long x = 0;
    for (char *p = s; *p; p++) {
        x *= 10;
        x += (int)(*p - '0');
        x %= n;
    }
    return x;
}

为了清楚起见,我省略了任何错误检查。作为练习,编写一些额外的代码以确保 s 是一个有效的以空字符结尾的字符串,表示一个没有任何空格/其他格式的大整数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-03
    • 2012-04-06
    • 2012-11-04
    • 2012-05-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    相关资源
    最近更新 更多