大整数结构体: struct bigInteger{ int digit[1000]; //保存大整数的若干位,每4个数字放在一个数组单元中 int size; //标记当前数组未使用的最后一个位置 }; 其中数组的低位存放数字的低位 例如:123456789 digit[0]=6789 digit[1]=2345 digit[2]=1
题目链接:http://ac.jobdu.com/problem.php?pid=1198 题目1198:a+b 时间限制:1 秒内存限制:32 兆特殊判题:否提交:10235解决:3608 题目描述: 实现一个加法器,使其能够输出a+b的值。 输入: 输入包括两个数a和b,其中a和b的位数不超过1000位。 输出: 可能有多组测试数据,对于每组数据, 输出a+b的值。 样例输入: 2 6 10000000000000000000 10000000000000000000000000000000 样例输出: 8 10000000000010000000000000000000
代码:
#include <iostream> #include<stdio.h> #include<string.h> using namespace std; /* run this program using the console pauser or add your own getch, system("pause") or input loop */ //大整数结构体 struct BigInteger{ int size; int digit[1000]; //四个数字为一个单位 //数的低位存放在数组的低位 如12345 digit[0]=2345 digit[1]=1 void outPut(){ //输出要从高位开始 for(int i=size-1;i>=0;i--){ if(i != size-1){ printf("d",digit[i]); //低位输出时不足4位要补0 } else{ printf("%d",digit[i]); } } } void setBigInteger(char *str){ //字符的高位要存储在低位 保证大整数的存储规则:低位存储在低位 inint(); int L=strlen(str); int tmp=0; int c=1; //权重 int j=0; for(int i=L-1;i>=0;i--){ tmp+=(str[i]-'0')*c; //cout<<tmp<<" "<<(str[i]-'0')<<" "<<c<<endl; c=c*10; j++; if(j == 4 || i == 0){ //够了四位数 或者 到了最后一位但不足四位 digit[size++]=tmp; tmp=0; j=0; c=1; } } } void inint(){ //初始化函数 size=0; for(int i=0;i<1000;i++){ digit[i]=0; } } BigInteger operator +(const BigInteger &b)const{ //大整数加法 从低位开始加 BigInteger ans; ans.inint(); int bound1=b.size; int bound2=size; int carry=0; //进位 for(int i=0;i<bound1 || i<bound2;i++){ //1.每个单元相加 int tmp=digit[i]+b.digit[i]+carry; //2.计算进位 carry=tmp/10000; //3.截取低四位并保存 ans.digit[ans.size++]=tmp%10000; } if(carry != 0){ //若计算后最高位任然有进位 ans.digit[ans.size++]=carry; } return ans; } }; char a[1002],b[1002]; int main(int argc, char *argv[]) { while(scanf("%s %s",a,b)!=EOF){ BigInteger b1,b2; b1.setBigInteger(a); b2.setBigInteger(b); BigInteger c=b1+b2; c.outPut(); cout<<endl; } return 0; }注意点: 大整数加法时,当两个数字位数不相同的时候,相加的最后要将位数多的那个数字的多出来的位数也要加进去,如123 + 3时,12不能忘了。 代码中的体现为:for(int i=0;i<bound1 || i<bound2;i++)的i<bound1 || i<bound2;,同时,最后的进位也不能丢掉,
if(carry != 0){ //若计算后最高位任然有进位 ans.digit[ans.size++]=carry; }`