C语言实现-大数相加
使用大数原因
- 在科学研究或者其他的统计中,很多时候会遇到非常大的数字,这时候就需要用到大数相加的方法来进行相加。(所给数超过了long long 的范围)
- 以字符串的形式来进行超大数据的相加,理论上只要你的内存允许,相加多大的数都可以。
原理
- 大数可能超出任何一种整数类型,会引发溢出问题,所以用字符串的格式存储字符串a,b;
(1)获取字符串a的长度为Len1,字符串b的长度为Len2
(2)把字符串数组转换为对应的整数
(2)比较Len1和Len2的大小,数组对齐,方便后续计算。
(4)用flag作计数器,方便进位
(3)创建数组c,大小为Len1,a数组与b数组每位相加
(4)判断是否进位
(7)还原为字符串数组
(9)因为两数相加一般从个位开始,一开始进行倒序,运算结束后,从高位到低位输出
代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void add(char a[],char b[],char c[]){
int flag = 0; //flag作为计数器,判断进位使用
int m,n,i,j;
int len1 = strlen(a);
int len2 = strlen(b);
for (m = 0;m < len1;m ++) //把字符串数组转换为对应的整数
{
a[m] -= 48;
}
for (n = 0;n < len2;n ++) //同上
{
b[n] -= 48;
}
if (len1 < len2) //数组对齐,方便后续计算
{
len1 = len2;
}
for (i = 0;i <= len1;i ++) //核心算法
{
c[i] = a[i] + b[i]; //每位相加
if (flag == 1) //计数器如果为1,进位加一,计数器归零
{
c[i] ++;
flag = 0;
}
if (c[i] > 9)
{
c[i] -= 10; //大于9,进位,计数器值变为1
flag = 1;
}
}
for (j = 0;j <= len1;j ++) //还原每一位,成为字符串数组
{
c[j] += 48;
}
if (c[len1] == '0') //头位如果是零,不打印该位
{
c[len1] = 0;
}
}
void swap(char p[]) //使数组倒序,方便在循环中进行进位运算
{
int i,k;
for (i = 0;i < strlen(p) / 2;i ++)
{
k = p[i];
p[i] = p[strlen(p)-1-i];
p[strlen(p)-1-i] = k; //交换
}
}
int main()
{
char a[10000]; //创建数组,定义大小
char b[10000];
char c[10000] = {}; //定义数组
gets(a);
gets(b);
swap(a); //数组倒序
swap(b); //数组倒序
add(a,b,c);
swap(c); //重新倒序使其变为原有顺序
puts(c);
system("pause");//暂停程序
return 0;
}