高精度加法

1.问题:过大的数没有合适的容器去存储,没有原生加减法允许我们去使用。

两个数字数组进行相加,数组可以随意控制大小。(数字字符串)保持数字的无限输入。

        char a[1000] = { 0 };
	char b[1000] = { 0 };
	scanf("%s%s", &a, &b);

思路:1.逆序存放数组,便于相加的位自然地对应,下标相同。(天然对齐)

void dealNumber(HighAcc *h)
{
	int i = 0, j = strlen(h->data) - 1; 
	char tmp;
	h->len = j + 1;
	for (; i <= j; i++, j--)
	{
		tmp =h-> data[i];
		h->data[i] = h->data[j] - '0';//交换的同时转为数字
		h->data[j] = tmp - '0';
	} 
} 

注意!!!(踩坑点)

切勿忘记    i  =  j   的时候,因为逆序的同时转为数字,与一般交换不同。

2.相加 (关键算法)

进位存到下一项,等下次循环与该位的数进行相加。

for (i = 0; i < maxlen; i++)
	{
		tmp=a.data[i] + b.data[i]+sum.data[i];
		sum.data[i] = tmp % 10;
		sum.data[i + 1] = tmp / 10;
	}

            3.打印和的数组(由于之前逆序存放,所以要倒着打印)

void printNumber(HighAcc h)
{
	int i;
	for (i = h.len - 1; i >= 0; i--)//逆着打印
	{
		putchar(h.data[i] + '0');
	}
}

代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include 
#include 
#include
typedef struct {
	char data[1000];
	int len;
}HighAcc;
//a = +(4, 5);
//a = 4 + 5;  +相当函数,把4,5传进去,给新变量
HighAcc add(HighAcc a, HighAcc b)
{
	HighAcc sum = { 0 };
	int tmp;
	int i;
	int maxlen = a.len> b.len ? a.len : b.len;
	for (i = 0; i < maxlen; i++)
	{
		tmp=a.data[i] + b.data[i]+sum.data[i];
		sum.data[i] = tmp % 10;
		sum.data[i + 1] = tmp / 10;
	}
	sum.len = maxlen + sum.data[maxlen];
	return sum;
}
void dealNumber(HighAcc *h)
{
	int i = 0, j = strlen(h->data) - 1; 
	char tmp;
	h->len = j + 1;
	for (; i <= j; i++, j--)
	{
		tmp =h-> data[i];
		h->data[i] = h->data[j] - '0';
		h->data[j] = tmp - '0';
	} 
} 
void printNumber(HighAcc h)
{
	int i;
	for (i = h.len - 1; i >= 0; i--)
	{
		putchar(h.data[i] + '0');
	}
}
int main()
{
	HighAcc a = { 0 };
	HighAcc b = { 0 };
	HighAcc sum;
	scanf("%s%s", a.data, b.data);
	dealNumber(&a);
	dealNumber(&b);
	sum = add(a, b);
	printNumber(sum);
	putchar('\n');
	system("pause");
	return 0;
}

 

你可能感兴趣的:(高精度加法)