当我们遇到一些数值非常巨大的整数以至于我们不能用任何一种数据类型来保存他的值,这个时候我们要考虑使用一个结构体来保存这个整数,并完成对其运算的实现。
1.实现一个加法器。使其能够输出a+b的值
样例输入:
2 6
10000000000 1000000000000000
样例输出:
8
1000010000000000
思路:定义一个结构体来保存一个高精度整数
struct bigInteger { int digit[1000]; int size; }digit数组保存大整数中每若干位数字,这里使用每4位一组。size表示digit数组中第一个还没有使用的数组单元。以整数123456789为例,gigit[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;//重新开始计算下4个字符 t=0;//临时变量清0 c=1;//权重变为1 } } } void output()//将高精度整数输出 { for(int i=size-1;i>=0;i--) { if (i!=size-1) printf("%04d",digit[i]); //若当前输出不是最高位数字 输出前导0;当前数字不足4位由0补充,如输出110001的后四位数 else printf("%d",digit[i]); } 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(scanf("%s%s",str1,str2)!=EOF) //输入 { a.set(str1);b.set(str2);//用两个字符串设置两个高精度整数 c=a+b; c.output(); } return 0; }