九度OJ:
算A+B;小于1000位;答案为9度给出的答案 做一个记录
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
/*
digit数组用来保存大整数中的若干位的数字,假设使用4为一个单位
整数123456789 digit[0] = 1234 digit[1] = 5678 digit[2] = 9
size 为digit数组中第一个我们还没有用到的数组单元
size = 3
*/
struct bigInteger
{
int digit[1000];
int size;
void init()
{
for (int i = 0; i < 1000; i++)
{
digit[i] = 0;
}
size = 0;
}
void set(char str[])
{
init();//初始化结构体
int L = strlen(str);//计算字符串长度
//从最后一位字符串开始倒叙遍历字符串,j控制每4个字符串转换为一个数字存入数组,t临时保存字符串
//转换为数字的中间值,c表示当前位的权重,按1,10,100, 1000顺序变化
for (int i = L - 1, j = 0, t = 0, c = 1; i >= 0 ; i--)
{
t += (str[i] - '0') * c;//计算这个四位数中当前字符代表的数字,即数字乘以当前权重
j++;
c *= 10;
//如果连续转换4个字符,或者已经到达最后一个字符
if (j == 4 || i == 0)
{
digit[size++] = t;
j = 0;
t = 0;
c = 1;
}
}
}
void output()
{
for (int i = size - 1; i >= 0; i--)
{
//如果当前位数不是最高位,用%04的输出前导0,即当前数字不足4位由0补充,如输出110001的后四位
if (i != size - 1)
printf("%04d", digit[i]);
else
printf("%d", digit[i]);//最高位,不用补0
}
printf("\n");
}
bigInteger operator + (const bigInteger & A) const
{
bigInteger ret;//返回值即两个数想加的结果
ret.init();
int carry = 0; //进位,初始值为0
for (int i = 0; i < A.size || i < size; i++)
{
int tmp = A.digit[i] + digit[i] + carry; //计算两个整数当前值以及来自低位的进位
carry = tmp / 10000; //计算该位的进位
tmp %= 10000;
ret.digit[ret.size++] = tmp; //保存当前位的结果
}
//计算结束后若最高位有进位
if (carry != 0)
{
ret.digit[ret.size++] = carry;
}
return ret;
}
}a, b, c;
char str1[1002], str2[1002];
int main()
{
while (cin >> str1 >> str2)
{
a.set(str1);
b.set(str2);
c = a + b;
c.output();
}
return 0;
}