c 语言 高精度加法

高精度加法

问题描述
  输入两个整数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,收工。

猜你喜欢

转载自blog.csdn.net/qq_42124842/article/details/90713538