高精度加法
问题描述
输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。
算法描述
由于a和b都比较大,所以不能直接使用语言中的标准数据类型来存储。对于这种问题,一般使用数组来处理。
定义一个数组A,A[0]用于存储a的个位,A[1]用于存储a的十位,依此类推。同样可以用一个数组B来存储b。
计算c = a + b的时候,首先将A[0]与B[0]相加,如果有进位产生,则把进位(即和的十位数)存入r,把和的个位数存入C[0],即C[0]等于(A[0]+B[0])%10。然后计算A[1]与B[1]相加,这时还应将低位进上来的值r也加起来,即C[1]应该是A[1]、B[1]和r三个数的和.如果又有进位产生,则仍可将新的进位存入到r中,和的个位存到C[1]中。依此类推,即可求出C的所有位。
最后将C输出即可。
输入格式
输入包括两行,第一行为一个非负整数a,第二行为一个非负整数b。两个整数都不超过100位,两数的最高位都不是0。
输出格式
输出一行,表示a + b的值。
样例输入
20100122201001221234567890
2010012220100122
样例输出
20100122203011233454668012
问题分析:
对两个数字的加法来说,如果有一个更长,需要注意的有:加法结束后是否有进位;剩余数字的处理;
步骤:
1,将字符串转化成数组数据(ASCII的处理;存放的数据顺序)
2,找出更长的数组
3,进行加减
4,加法结束后判断是否有进位,以及剩余数字的赋值处理
5,倒序输出
代码展示(已验证):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define M 101
#define max(x,y) (x>y ? x:y)
#define min(x,y) (x<y ? x:y)
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[])
{
int i;
int len_a, len_b;
char a[M], b[M];
char a2[M] = { 0 }, b2[M] = { 0 }; //存放颠倒顺序后的数字串
int c[1 + M] = { 0 };
gets(a);
gets(b);
len_a = strlen(a);
len_b = strlen(b);
int la = len_a - 1;
int lb = len_b - 1;
// 首尾调换顺序 存储在a2[] b2[] 中 方便相加
for (i = 0; i < len_a; i++)
{
a2[la] = a[i]-48; // 将ASCII 码值 减去48(48-57) 所剩数字 为 0-9
la -= 1;
}
for (i = 0; i < len_b; i++)
{
b2[lb] = b[i]-48;
lb -= 1;
}
int k=0; // k 保存进位数据
int j = 0; // 数组c[] 的长度
int m = max(len_a, len_b); // 两个数组最长的一个的长度 以此来进行 所有数字的相加
int n = min(len_a, len_b); // 两个数字与最短的一个的长度 以此进行加法的及时转换
for(i=0;i<n;i++) // 两个数组相加
{
c[j] = (a2[i] + b2[i]) + k;
k = c[j]/10;
c[j]=c[j]%10;
j++;
if (i == n - 1 && k>0) // 最后一个进位
{
c[j] = k;
}
}
// 将短数相加之后 剩下的数据直接赋值给c[]
for (i = n; i<m; i++)
{
if (len_a>len_b) // 与剩余的长的数 相加
{
if (k > 0)
{
c[j] = a2[i] + k; // 两数相加之后还有进位 如果是9的话 这个地方没有进位 有问题
if(c[j]==10) // 加上判定条件后就ok 了
{
c[j]%=10;
k=1;
}
else
{
k=0;
}
}
else
c[j] = a2[i]; // 两数相加之后无进位
j++;
}
else
{
if (k > 0)
{
c[j] = b2[i] + k;
if(c[j]==10)
{
c[j]%=10;
k=1;
}
else
{
k=0;
}
}
else
c[j] = b2[i];
j++;
}
}
if(len_a == len_b && k>0)
printf("1");
for (i = j-1; i>=0; i--) // 两个数组相加之后的和的数据输出 i=j-1 从后往前输出
{
printf("%d", c[i]);
}
return 0;
}
泡泡:
嗯,这道题没什么特别难的,需要注意的还是一些细节问题的处理。ok,收工。