大数相加
题目:实现2个大整数(绝对值≤101000-1)相加(注:不允许写c=a+b;形式)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int length_a=0, length_b=0, length_c=0; /*记录加数、被加数和结果的长度*/
/*大整数的加法*/
void Add(int *a,int *b,int *result)
{
int max = length_a, CY = 0, tmp = 0, flag = 1, i;
if (max < length_b) /*比较两个加数的长度*/
max = length_b; /*找出最大值*/
if (a[length_a - 1] < 0 && b[length_b - 1] < 0) /*a+b,a<0,b<0*/
{
flag = 2; /*flag置2*/
a[length_a - 1] = b[length_b - 1] = 0; /*数据最后一位'-1'置0*/
length_a--; length_b--; /*更新length_a、length_b*/
max--; /*更新max变量*/
}
else if (a[length_a - 1] > 0 && b[length_b - 1] < 0) /*a+b,a>0,b<0*/
{
flag = 3; /*flag置3*/
b[length_b - 1] = 0; /*b最后一位'-1'置0*/
length_b--; /*更新length_b*/
max = length_a; /*比较两个加数的长度*/
if (max < length_b) /*找出最大值*/
max = length_b;
for (i = max - 1; i >= 0; i--) /*如果|a|<|b|,则交换a,b的位置*/
{
if (a[i] < b[i]) /*从最高位开始,如果a的某一位小于b*/
{
for (i = 0; i < max; i++)
{
tmp = a[i];
a[i] = b[i];
b[i] = tmp;
}
flag = 4; /*flag置4*/
break; /*跳出循环*/
}
else if (a[i] > b[i]) /*如果a的某一位大于b*/
{
break; /*跳出循环*/
}
}
}
else if (a[length_a - 1] < 0 && b[length_b - 1] >0) /*a+b,a<0,b>0时转成b+a*/
{
flag = 3; /*flag置3*/
a[length_a - 1] = 0; /*b最后一位'-1'置0*/
length_a--; /*更新length_a*/
max = length_a;
if (max < length_b) /*更新max变量*/
max = length_b;
for (i = 0; i < max; i++) /*交换a, b的位置*/
{
tmp = a[i];
a[i] = b[i];
b[i] = tmp;
}
for (i = max - 1; i >= 0; i--) /*如果|a|<|b|,则交换a,b的位置*/
{
if (a[i] < b[i]) /*从最高位,如果a的某一位小于b*/
{
for (i = 0; i < max; i++)
{
tmp = a[i];
a[i] = b[i];
b[i] = tmp;
}
flag = 4; /*flag置4*/
break; /*跳出循环*/
}
else if (a[i] > b[i]) /*如果a的某一位大于b*/
{
break; /*跳出循环*/
}
}
}
if (flag == 1 || flag == 2) /*a>0,b>0和a<0,b<0这两种情况*/
{
for (i = 0; i <= max; i++)
{
result[i] = a[i] + b[i] + CY; /*a,b每一位相加,考虑前面的进位*/
CY = 0; /*进位标志清零*/
if (result[i] > 9) /*相加结果大于9*/
{
result[i] -= 10; /*处理结果*/
CY = 1; /*产生进位*/
}
}
}
else if (flag == 3 || flag == 4) /*a>0,b<0和a<0,b>0这两种情况*/
{
CY = 0;
for (i = 0; i < max; i++)
{
result[i] = a[i] - b[i] - CY; /*a,b每一位相减,考虑前面的借位*/
CY = 0; /*借位标志清零*/
if (result[i] < 0) /*相减结果小于0*/
{
result[i] += 10; /*处理结果*/
CY = 1; /*产生借位*/
}
}
}
for (i = max; i >= 0; i--)
{
if (result[i] != 0) /*定位到最高位的位置 */
{
tmp = i; /*记录下这个位置 */
break; /*跳出循环 */
}
}
length_c = tmp + 1; /*更新结果的length */
if (flag == 2 || flag == 4) /*a+b(a<0,b<0),a*b(a>0||b<0)的情况*/
result[length_c - 1] *= -1; /*结果加负号*/
}
/*判断输入正确与否*/
void Judge(char *tmp)
{
if (strlen(tmp) >= 1000 && tmp[0] != '-' || strlen(tmp) >= 1001 && tmp[0] == '-')
{
printf("Error Input!"); /*正数的字符不超过1000个,负数不超过1001个*/
exit(1); /*退出程序*/
}
}
int main(void)
{
char A[1001], B[1001];
int a[1001] = { 0 }, b[1001] = { 0 }, c[1001] = {0}, j;
unsigned int i;
printf("请输入一个大整数a:");
gets_s(A,1001); /*输入被加数a*/
Judge(A); /*判断输入正确与否*/
printf("请输入一个大整数b:");
gets_s(B,1001); /*输入被加数b*/
Judge(B); /*判断输入正确与否*/
for (i = 0; i < strlen(A); i++) /*字符数组转成整型数组*/
{
a[strlen(A) - i - 1] = A[i] - '0'; /*逆序存放*/
length_a++; /*记录被加数a的长度(除负号)*/
}
if (A[0] == '-') /*如果是负数,数组的最后一个数置成-1*/
{
a[strlen(A) - 1] = -1;
}
for (i = 0; i < strlen(B); i++) /*字符数组转成整型数组*/
{
b[strlen(B) - i - 1] = B[i] - '0'; /*逆序存放*/
length_b++; /*记录加数b的长度(除负号)*/
}
if (B[0] == '-') /*如果是负数,数组的最后一个数置成-1*/
{
b[strlen(B) - 1] = -1;
}
Add(a,b,c); /*调用加法函数*/
printf("Output: ");
for (j = length_c-1; j >= 0; j--) /*输出结果*/
{
printf("%d",c[j]);
}
printf("\n");
return 0;
}