高精度整数 1

/*
高精度整数
题目1198:a+b
题目描述:
实现一个加法器,使其能够输出a+b的值。
输入:
输入包括两个数a和b,其中a和b的位数不超过1000位。
输出:
可能有多组测试数据,对于每组数据,
输出a+b的值。
样例输入:
2 6
10000000000000000000 10000000000000000000000000000000
样例输出:
8
10000000000010000000000000000000
*/
#include <stdio.h>
#include <string.h>
struct biginteger{//高精度整数结构体
int digit[1000];//按四位数一个单位保存数值
int size;//下一个我们未使用的数组单元
void init(){//对结构体的初始化
for(int i=0;i<1000;i++) digit[i] = 0;//所有数位清0
size = 0;//下一个未使用数组单元为0,即没有一个单元被使用
}
void set(char str[]){//从字符串中提取整数
init();//对结构体初始化
int l = strlen(str);//计算字符串长度
for(int i=l-1,j=0,t=0,c=1;i>=0;i--){
//从最后一个字符开始倒序遍历字符串,j控制每4个字符转换为一个数字存入
//数组,t临时保存字符转换为数字的中间值,c表示当前位的权重,按1,10,
//100,1000顺序变化
t += (str[i] - '0')*c;//计算这个四位数中当前字符代表的数字,即
//数字乘以当前位权重
j++;//当前转换字符数增加
c *= 10;//计算下一位权重
if(j==4 || i==0){//若已经连续转换四个字符,或者已经到达最后一个字符
digit[size++] = t;//将这四个字符代表的四位数存入数组,size
//移动到下一个数组单位
j = 0;//重新开始计算下4个字符
t = 0;//临时变量清0
c = 1;//权重变为1
}
}
}
void output(){//将该高精度整数输出
int i;
for(i=size-1;i>=0;i--){
if(i != size - 1) printf("%04d",digit[i]);
//若当前输出的数字不是最高位数字,用%04的输出前导0,即当前
//数字不足4位时用0补充,如输出110001的后四位数
else printf("%d",digit[i]);//若是最高位,则无需输出前导零
}
printf("\n");//换行
}
biginteger operator + (const biginteger &A) const{//加法运算符
int i;
biginteger ret;//返回值,即两数相加的结果
ret.init();//对其初始化
int carry = 0;//进位,初始值为0
for(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(scanf("%s%s",&str1,&str2) != EOF){//输入
a.set(str1);
b.set(str2);//用两个字符串分别设置两个高精度整数
c = a + b;//计算它们的和
c.output();//输出
}


return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值