前言
所谓超大数,就是整型int64字节装不下的值
而我们今天就是要实现一个64位以上的数相加,得出结果
思路
我的想法是把这个数以字符形式存到数组里
运算时再转换成int一位一位计算
得出结果再以字符形式输出
实践
先实现底层逻辑
int main()
{
char bignum1[100] = { 0 };
char bignum2[100] = { 0 };
char bigsum[100] = { 0 };
scanf("%s",&bignum1);
scanf("%s",&bignum2);
bignum_Add(bignum1,bignum2,bigsum);
return 0;
}
先输入两个需要相加的值存放到bignum1和bignum2里
bigsum作为结果数组
int count = 0;
char* pb = bigsum;
把bigsum第一位地址存入pb备用
接下来就是函数的实现
*因为在加法过程中可能会有要进位的情况出现,所以我决定从最后一位开始加
所以需要先让指针指向最后一个输入的数据
while (*bignum1)
{
bignum1++;
}
while (*bignum2)
{
bignum2++;
bigsum++;//
}
bignum1--;//因为经过while循环指针会指向输入数据的后一个元素
bignum2--;//所以需要--调整指针
这样,指针就指向最后一个输入的数据了
*注:这里把结果数组bigsum地址也一起++,刚好就方便腾出空间放置结果
但后面bigsum没有--,是为了多腾出一个元素放置可能因为进位多出的第一位
(例:9+2=11,两个一位数相加可能得到两位数)
指针调整好,接下来就可以进行计算了
int a = (*bignum1 - '0' + *bignum2 - '0');
bigsum[0] = (a % 10) +count+ '0';
数字字符 - 字符'0'得到的结果刚好就是对应的数字,再计算得到的结果存入a
(a%10得到个位数),+前一位的进位,+字符'0'再转换为数字字符
存入bigsum指向的空间
计算完后,还要调整进位
count = 0;
if (a > 9)
count = 1;
默认为0,如果a>9,给count赋1
因为有很多位数要计算,所以要放进循环里
这是循环的调整
*bignum1 = '\0';
*bignum2 = '\0';
bignum1--;
bignum2--;
bigsum--;
*注:赋'\0'是因为对该位已经计算完了,赋'\0'用来结尾
不然指针向前挪动还会带着计算过得位数
当然,还要对第一位是否进位判断
if (bigsum == pb)
{
if (count == 1)
{
*pb = '1';
}
break;
}
如果bigsum == pb 即如果回到第一个元素的地址
判断pb是否进位
break跳出循环
最后打印
printf("%s", bigsum);
结果代码
#include <stdio.h>
void bignum_Add(char* bignum1,char*bignum2,char*bigsum)
{
int count = 0;
char* pb = bigsum;
while (*bignum1)
{
bignum1++;
}
while (*bignum2)
{
bignum2++;
bigsum++;
}
bignum1--;//因为经过while循环指针会指向输入数据的后一个元素
bignum2--;//所以需要--调整指针
while (*bignum1 && *bignum2)
{
int a = (*bignum1 - '0' + *bignum2 - '0');
bigsum[0] = (a % 10) +count+ '0';
count = 0;
if (a > 9)
count = 1;
*bignum1 = '\0';
*bignum2 = '\0';
bignum1--;
bignum2--;
bigsum--;
if (bigsum == pb)
{
if (count == 1)
{
*pb = '1';
}
break;
}
}
printf("%s", bigsum);
}
int main()
{
char bignum1[100] = { 0 };
char bignum2[100] = { 0 };
char bigsum[100] = { 0 };
scanf("%s",&bignum1);
scanf("%s",&bignum2);
bignum_Add(bignum1,bignum2,bigsum);
return 0;
}
缺点
1.计算过程中会改变原来的数组
2.待计算数据中不能有0;不然会因为while停止循环,即只会计算0之前的数据
3.num2必须比num1位数多,不然会越界访问,因为bigsum是跟着num2一起动的