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 <stdio.h>
#include <stdlib.h>
#include<string.h>
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;
}