【问题标题】:Use of bigint in C (Example using libtomath library)在 C 中使用 bigint(使用 libtomath 库的示例)
【发布时间】:2021-11-07 12:17:25
【问题描述】:

我想用大整数做一些类似下面的计算:

#include<stdio.h>

int main (){
  long a = 123456789123456789123456789123456789;
  long b = 2*b;

  printf("%ld", a);
  printf("\n");
  printf("%ld",b );
  return 0;
}

当前生成:

main.c:4:12: error: integer literal is too large to be represented in any integer
      type
  long a = 123456789123456789123456789123456789;
           ^
1 error generated.

我知道有一个名为 libtomath 的库,正如另一个 SO question 所指出的那样,但我找不到任何示例,而且我是 C 新手,不知道如何通读库来找到回答。如何使用 libtomath(或其他解决方案)修改代码?

【问题讨论】:

    标签: c math biginteger bigint


    【解决方案1】:

    您可以处理给定@https://github.com/libtom/libtommath/tree/develop/docbn.tex 文件以生成libtomath 的PDF 文档。如果您不能这样做,请告诉我,我会为您生成 PDF。

    【讨论】:

    • 非常感谢您的回答@shiv。我下载了 repo 并尝试用pdflatex bn 编译bn.tex,但它给了我一个错误! LaTeX Error: File 'bn.ind' not found.。确实我找不到那个文件
    • 让我为你处理。
    • 非常感谢! @Shiv。你没有File 'bn.ind' not found 问题。你能找到那个文件吗?
    • bn.ind 文件或*.ind 文件是由makeindex 程序生成的LaTeX 中的索引文件。检查您的操作系统是否有makeindex 程序。
    【解决方案2】:

    最好的方法是使用gmp

    #include <gmp.h>
    #include <stdio.h>
     
    int main(int argc, char *argv[])
    {
        mpz_t x,y,two;
        if (argc<3)
            return 1;
        mpz_init_set_str (x, argv[1], 10);
        mpz_init_set_str (y, argv[2], 10);
        mpz_init_set_ui(two, 2U);
        mpz_add (x,x,y);/*x<-x+y*/
        mpz_mul (y,y,two);/*y<-y+y*/
        printf("%s\n", mpz_get_str (NULL, 10, x));
        printf("%s\n", mpz_get_str (NULL, 10, y));
        return 0;
    }
    

    你可以这样使用它:

    % gcc addbig.c -lgmp
    % ./a.out 49378437483789437894739874389\ 
              74387438978437894378743874837
    123765876462227332273483749226
    148774877956875788757487749674
    % ./a.out 1111111111111111111111111111111111111111111\
              2222222222222222222222222222222222222222222
    3333333333333333333333333333333333333333333
    4444444444444444444444444444444444444444444
    

    【讨论】:

    猜你喜欢
    • 2012-05-24
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多