在 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;
}
这是一个相当简单的问题:
如何获取 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;
}