在处理某些问题的时候有时会遇到及其庞大的数字,数字型的变量可能不能完全容纳,那么此时我们可以用字符串来实现庞大数字的运算。
将字符串存入数组中,a[0](a[1]也可以)是最低位,从最低位开始加,将每位相加的结果存入另一个数组中,要考虑的是进位的问题,可以依次处理每一位向前进位,最后再输出即可。
以下代码为边加边进位的方式,也可以选择先加完,最后进位。
#include<stdio.h>
#include<string.h>
#include<string>
#include<iostream>
#define MAXN 50001
using namespace std;
int main()
{
void init (int x[], string chr, int len);
int add (int x[], int y[], int z[], int len);
void output (int z[], int len);
string str1, str2;
int a[MAXN]={0}, b[MAXN]={0}, z[MAXN]={0};
int l1, l2, len ,i;
cin>>str1>>str2;
l1 = str1.size();
l2 = str2.size();
init (a, str1, l1);
init (b, str2, l2);
if (l1 >= l2)
{
len = add (a, b, z, l1);
}
else
{
len = add (a, b, z, l2);
}
output (z, len);
return 0;
}
void init (int x[], string str, int len) //字符串转换成数组
{
int i;
for (i = 0; i <= len -1; i++) //输入字符串从个位传入到数组中
{
x[len-1-i] = str[i] - '0';
}
}
int add (int x[], int y[], int z[], int len)
{
int i, j, r;
for (j = 0; j < len; j++) //每一位相加
{
z[j] += x[j] + y[j]; //当前位相加
for (i = j; i < len; i++) //判断是否需要进位
{
if (z[i] >= 10) //当前位大于10需要进位
{
z[i+1] += z[i]/10; //下一位获得进位的数
z[i] %= 10; //当前位归为10以内的数
if (z[len] > 0) //若最高位增加则长度增大
len++;
if (z[i+1] < 10) //若下一位小于10不需要进位则退出当前循环
break;
}
}
}
return len;
}
void output (int z[], int len)
{
int i;
for (i = len-1; i >= 0; i--)
{
printf ("%d", z[i]);
}
printf ("\n");
}