您的位置:首页 > 其它

九度 OJ 1198 高精度加法

2017-03-11 20:41 369 查看
题目描述:实现一个加法器,使其能够输出a+b的值。输入:输入包括两个数a和b,其中a和b的位数不超过1000位。输出:可能有多组测试数据,对于每组数据,输出a+b的值。样例输入:
2 610000000000000000000 10000000000000000000000000000000
样例输出:
810000000000010000000000000000000
来源:2010年华中科技大学计算机研究生机试真题
#include <stdio.h>#include<string.h>using namespace std;struct bigInteger {int digit[1000];    //按四位数一个单元保存高精度数int size;       //下一个未使用的数组单元void init() {for(int i=0;i<1000;i++) {   //所有位数清零digit[i] = 0;}size = 0;   //下一个未使用的数组单元为0,计没有一个单元被使用}//从字符串中提取整数,将str[]的第四位放到digit高1位上,以此类推void set(char str[]) {init();int L = strlen(str);//倒序遍历字符串,j控制每4个字符转换为一个数组存入数组,t为临时变量,c为当前权重,按10、100、1000//变化for(int i=L-1,j=0,t=0,c=1;i>=0;i--) {t += (str[i]-'0')*c;c*=10;  //权重变化j++;    //转换数字的增加if(i==0 || j==4) {  //若已经连续转换4个字符或已经到达最后一个字符digit[size++] = t;//重新开始另4位c = 1;j = 0;t = 0;}}}//将高精度数输出void output() {for(int i=size-1;i>=0;i--) {if(i!=size-1) {printf("%04d",digit[i]);}else{  //若是最高位,无需输出前导零printf("%d", digit[i]);}}printf("\n");}//重载加法运算符bigInteger operator + (const bigInteger &A) const {bigInteger ret;ret.init();int carry = 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;        //保存该位结果}//经循环最后carry若不为0则保存进位if(carry != 0) {ret.digit[ret.size++] = carry;}return ret;}};bigInteger 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;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息