在 C 中添加大整数值

Adding large integer values in C

这是一个相当简单的问题:

如何获取 2 个无符号整数值并将它们添加到 C 以用于以下输入约束。

0 <= A, B <= 10^98

我知道我可以将输入作为一个字符串,但我仍然想到了这个问题。

我已经写了下面的代码,但是它不能取这么大的值 10^98

#include <stdio.h>

int main() {
    unsigned long long int a, b;
    int x = scanf("%llu%llu", &a, &b);
    while (x > 0) {
        printf("%llu\n",(a + b));
        x = scanf("%llu%llu" ,&a, &b);
    }
    return 0;
}

尝试使用 bignum 库,例如 GMP。这是一个例子。

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

int main(){

  char inputStr[1024];
  /*
     mpz_t is the type defined for GMP integers.
     It is a pointer to the internals of the GMP integer data structure
   */
  mpz_t n;
  int flag;

  printf ("Enter your number: ");
  scanf("%1023s" , inputStr); /* NOTE: never every write a call scanf ("%s", inputStr);
                                  You are leaving a security hole in your code. */

  /* 1. Initialize the number */
  mpz_init(n);
  mpz_set_ui(n,0);

  /* 2. Parse the input string as a base 10 number */
  flag = mpz_set_str(n,inputStr, 10);
  assert (flag == 0); /* If flag is not 0 then the operation failed */

  /* Print n */
  printf ("n = ");
  mpz_out_str(stdout,10,n);
  printf ("\n");

  /* 3. Add one to the number */

  mpz_add_ui(n,n,1); /* n = n + 1 */

  /* 4. Print the result */

  printf (" n +1 = ");
  mpz_out_str(stdout,10,n);
  printf ("\n");


  /* 5. Square n+1 */

  mpz_mul(n,n,n); /* n = n * n */


  printf (" (n +1)^2 = ");
  mpz_out_str(stdout,10,n);
  printf ("\n");


  /* 6. Clean up the mpz_t handles or else we will leak memory */
  mpz_clear(n);

}

你不能为此使用常规算术类型,即使 unsigned long long 只有 64 位,这比你的目的所需的要少得多。

另请注意,您的循环测试不正确:应该是 while (x == 2)

这是一个可以处理 99 位小数的小程序:

#include <stdio.h>
#include <string.h>

char *bigadd(char *c, const char *a, const char *b) {
    size_t alen = strlen(a);
    size_t blen = strlen(b);
    size_t clen = (alen > blen) ? alen : blen;
    size_t i = clen;
    int digit, carry = 0;
    c[i] = '[=10=]';
    while (i > 0) {
        digit = ((alen ? a[--alen] - '0' : 0) +
                 (blen ? b[--blen] - '0' : 0) +
                 carry);
        carry = digit >= 10;
        c[--i] = (char)('0' + (digit - carry * 10));
    }
    if (carry) {
        memmove(c + 1, c, clen + 1);
        c[0] = '1';
    }
    return c;
}

int main(int argc, char *argv[]) {
    char a[100], b[100], c[101];

    while (scanf("%99s%99s", a, b) == 2) {
        printf("%s\n", bigadd(c, a, b));
    }
    return 0;
}