【问题标题】:multiplication of string [ containing integer], output also stored in string, How? [duplicate]字符串[包含整数]的乘法,输出也存储在字符串中,如何? [复制]
【发布时间】:2011-08-12 03:33:18
【问题描述】:

可能的重复:
Inputting large numbers in c++?
Arbitrary-precision arithmetic Explanation

我需要将两个巨大的整数相乘,比如:

 a=1212121212121212121212121212121212121212121212121212;
 b=1212121212121212121212121212121212121212121212121212;    

我认为 C 和 C++ 中没有数据类型可以保存这么大的整数,所以我想将其保留为字符串格式,例如:-

char *number1="1212121212121212121212121212121212121212121212121212";
char *number2="1212121212121212121212121212121212121212121212121212";

在乘法期间,我借助 atoi() 函数将其转换为字符串,例如:

atoi(number1)*atoi(number2);

像往常一样,这个乘法的输出显然会很大,所以我需要将输出更改为字符串格式。
我知道有一个itoa() 函数可以将整数转换为字符串,但它与所有编译器都不兼容。谁能告诉我在这种情况下我应该怎么做?

我正在使用 Ubuntu-10.04 和 g++ 编译器。

【问题讨论】:

  • 如果您的字符串太大, atoi() 将无法解决问题,您的结果将是一个完全不同的数字..
  • @Sayem Ahmed-sir 我正在尝试实现 rsa,所以我必须这样做......

标签: c++ c string


【解决方案1】:

由于 C 和 C++ 不提供支持大数字的本机类型,因此调用 atoi() 来解析此类数字是没有意义的。 atoi() 返回一个本机 int,在 32 位平台上上限为 2,147,483,647

您可以使用众多bignum libraries 之一,例如GMP

【讨论】:

  • 我建议不要将 GMP 用于严肃的事情。在我看来,它作为一个通用库失败得很惨,因为内存不足的错误会导致你的程序立即退出,把地毯从你下面拉出来。如果您不介意那个小“弱点”,这是一个非常好的工具。
  • @paxdiablo,为他们辩护,正确处理该案件似乎是very tricky to do
  • 我的意见是他们应该从一开始就处理这个问题。但不要误会我的意思,除此之外,这是一段该死的好代码。很快,我“提升”了他们的一些算法,为我自己的代码产生了一种较少用户滥用的方法:-)
【解决方案2】:

我认为,除了使用一些数学库之外,最好的变体是将这些数字拆分为具有一些固定限制的 int 数组。然后只需使用基本的数学乘法方法执行乘法。不要忘记溢出。

【讨论】:

    【解决方案3】:

    将大数相乘非常 困难,但是我们可以做到 应用对数 两个数的乘法公式 现在我们要知道我们是如何 得出两个数字的乘积' 对数。

    让我们考虑 a、m 和 n 是正实数,但 a 不等于 1,这意味着“a”属于 R+ – {1}。 m和n以a为底的对数分别为x和y,满足ax等于m和y等于n的条件。

    loga (m.n) = x + y
    
    As we already know x = loga m and y = loga n.
    
    loga (m.n) = loga m + loga n
    

    两个值相乘的对数等于相同值的对数之和。相同的对数基础现在可以通过添加这些值的对数来帮助我们将两个大数相乘。如果您没有计算器,只需借助对数表的帮助来执行此操作。

    【讨论】:

    • 这无济于事。由于最终结果也很大,因此取反对数会给出一个不适合标准 int 数据类型的数字。
    【解决方案4】:

    使用 atoi() 也无济于事,因为数字本身不适合整数数据类型。

    你必须模拟你在小学时所做的方法。

     121
     *23
    ----
     363
    242*
    ----
    2783
    

    实现留作练习。您还需要知道如何添加大数字。

    【讨论】:

    • 加法不是什么大问题,乘法显示问题,
    猜你喜欢
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多