2

我正在处理 2 个 64 位整数,需要将这两个数字相乘。当我尝试将其存储到long long int变量中时,出现以下编译错误:

1.c:在函数'main'中:
1.c:5:6:警告:整数常量对于它的类型来说太大了。
a = 1234567890123456789012345678901234567890123456789012345678901234;

有人可以告诉我如何将整数存储在 C 中吗?

[编辑] OP 后来暗示了一个 64位十进制数字。

4

3 回答 3

6

1234567890123456789012345678901234567890123456789012345678901234不是 64 位数字。它是一个 64位十进制数字,需要存储大约 210+ 个二进制位。

尝试存储 64 位数字

long long s1 = 9223372036854775807;
long long s2 = -9223372036854775807 - 1;
unsigned long long u1 = 18446744073709551615u;

要在标准 C 中存储 64 位十进制数,您需要使用另一种方法,因为 C 的整数类型仅指定为最多 64 位二进制数字(位),尽管可能存在更宽的数字:存储为您自己的数字数组,作为字符串,或使用像gmp这样的 bignum 库。这取决于您要如何处理存储的 64 位十进制数字。


示例字符串方法。它缺乏缓冲区保护,也不删除前导零,效率不高。它确实演示了所需的流程 -基本长乘法

char *string_mult2(char *product, const char *a, const char *b) {
  size_t alen = strlen(a);
  size_t blen = strlen(b);
  size_t clen = alen + blen;
  memset(product, '0', clen);
  product[clen] = 0;
  for (size_t ai = alen; ai-- > 0;) {
    unsigned acc = 0;
    size_t ci = --clen;
    for (size_t bi = blen; bi-- > 0;) {
      acc += product[ci] - '0' + (a[ai] - '0') * (b[bi] - '0');
      product[ci--] = acc % 10 + '0';
      acc /= 10;
    }
    product[ci] = acc % 10 + '0';
  }
  return product;
}

int main(void) {
  char *a = "1234567890123456789012345678901234567890123456789012345678901234";
  //a = "12";
  char *b = a;
  char product[200];
  puts(string_mult2(product,a,b));
  return 0;
}

输出

在您尝试编译代码并运行它后,将鼠标悬停在下面查看我的结果。

01524157875323883675049535156256668194500838287337600975522511810828928529615005335814711781866792303015211342784374455267227

于 2017-06-15T20:30:33.630 回答
1

这使用GNU 多精度算术库将两个 64 位小数整数相乘

例子.c

#include <gmp.h>
#include <stdio.h>

int main(void)
{
  // A 64-digit number expressed as a string
  const char str[] = "1234567890123456789012345678901234567890123456789012345678901234";

  mpz_t n;                         // mpz_t is the type defined for GMP integers
  mpz_init(n);                     // Initialize the number

  mpz_set_str(n, str, 10);         // parse the string as a base-10 number

  mpz_mul(n, n, n);                // square the number (n = n * n)

  printf("n * n = ");              // print the result
  mpz_out_str(stdout, 10, n);

  return 0;
}

编译并与 GMP 库链接

gcc -lgmp example.c -o example

输出

n * n = 15241578753238836750495351562566681945008382873376009755225118122311263526910001524158887639079520012193273126047859425087639153757049236500533455762536198787501905199875019052100

参考

于 2020-05-11T04:29:17.497 回答
0

对于 64 位整数, Along long int或 anint64_t就足够了。但是,最大的 64 位整数是 9,223,372,036,854,775,807,而您的数字比这大,因此可以使用 128 位整数,但恐怕这还不够。

GCC 确实有uint128_t/int128_t类型,从版本 4 开始。阅读更多内容在 gcc 中是否有 128 位整数?

于 2017-06-15T20:28:25.577 回答