a+b - 九度教程第60题
题目
时间限制:1 秒 内存限制:32 兆 特殊判题:否
题目描述: 实现一个加法器,使其能够输出 a+b 的值。
输入: 输入包括两个数 a 和 b,其中 a 和 b 的位数不超过 1000 位。
输出:
可能有多组测试数据,对于每组数据,输出 a+b 的值。
样例输入:
2 6
10000000000000000000 10000000000000000000000000000000
样例输出:
8
10000000000010000000000000000000
来源:
2010年华中科技大学计算机研究生机试真题
这是一例典型的考察高精度整数的题,其输入非常巨大(1000 位),不能使用任何整数类型来直接保存它。使用C/C++首先明确高精度整数的保存形式,常用如下结构体来保存一个高精度整数:
struct bigInteger {
int digit[1000];
int size;
};
其中digit数组用来保存大整数中每若干位的数字,这里暂且使用每4位为一个单位保存,size为digit数组中第一个还没使用的数组单元(即下一个可以使用的数组单元)。以整数123456789为例,当使用该结构体来保存该值时,其结果是这样的:digit[0]=6789,digit[1]=2345,digit[2]=1,size=3
#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;
}
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){
//若已经连续转换4个字符,或已经达到最后一个字符
digit[size++]=t;
//将这四个字符代表的四位数存入数组,size移动到下一个数组单位
j=0;
t=0;
c=1;
}
}
}
void output(){//将该高精度整数输出
for(int i=size-1;i>=0;i--){
if(i!=size-1)printf("%04d",digit[i]);
//若当前输出的数字不是最高位数字,用%04d的输出前导0,
//即当前数字不足4位时由0补充,如输出10001的后四位数
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;//计算该位的进位
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;
}
实现高精度加法,即用代码模拟加法的运算法则,按照从低位开始各对应位相加并加上来自低位的进位从而获得本位的数值以及进位的规则进行运算。采用了重载+运算符的方法来实现该加法运算,也可以使用定义一个参数为两个加数返回值为它们和的求和函数,它们的运算原理完全相同。
高精度减法运算法则与加法类似,从最低位开始依次相减并减去来自低位的借位从而得出本位的结果和向高位的借位。
补充
对于高精度整数,Java类库中已经内置了BigInteger类处理大数。
//Java版本大数运算,包括了+,-,×三种运算
import java.util.Scanner;
import java.math.BigInteger;
public class Main{
public static void main(String[] args){
Scanner cin=new Scanner(System.in);
while(cin.hasNext()){
BigInteger a,b;
a=cin.nextBigInteger();
b=cin.nextBigInteger();
System.out.println(a.add(b));
System.out.println(a.subtract(b));
System.out.println(a.multiply(b));
}
}
}
//Python版本大数运算,包括了+,-,×三种运算
while True:
try:
a,b=int(input()),int(input())
print(a+b)
print(a-b)
print(a*b)
except:
break