转载:http://www.du52.com/text.php?id=411
在这个大数据的年代里,我们不可避免会遇到两个超越正常数据类型(如int,long,long long)的整数相加。显然两个大数据已经不能使用传统的加号直接相加,但是相加的原理仍然是不变的,就是简单的同位相加,超9进1.接下来我们将叙述用数组保存的大数据相加的代码。
- /*
- 大数相加:超越数据类型范围的也可以进行相加
- 分析: 用一维数组解决
- 1.数据元素的输入 用getchar无限输入字符 ,从下标0开始 保存元素 保存顺序是高位在前,低位在后,输入123
- 保存a1[0]=1....这里也要把字符转换为整形,关系 整数1+'0' ='1'
- 2.一但遇到进位问题,上面这种就会溢出,数据无法完全保存,所有 把上面的存储顺序改成是 低位在前,高位在后
- 如输入123 a[0]=3,a[1]=2
- 3.相加操作 :把每一位进行相加 这里用已存在的数字对相加结果进行保存,输入的数可能长度不一,所有数组长度要
- 取最输入最长的
- 4.相加进位问题:因是每一位相加,结果可能会大于9,大于9的就要进行进位操作,其它的不变
- 5.显示输出结果问题:可能会出现少位数或多位数的,这里就用一变量ncount解决
- */
- #include<iostream>
- using namespace std;
- int main()
- {
- int a1[100];
- int b1[100];
- int a[100]={0};
- int b[100]={0};
- int na ,nb; //保存数组元素的长度
- int ncount = 0; //相加后的数组共有多少个元素
- int i,j;
- i = 0;
- j = 0;
- ////////////////////输入数据//////////////////////////////
- cout<<"请输入加数:";
- while ( (a1[i]=getchar()) !=' ' ) //下标小的保存高位
- {
- a1[i] = a1[i]-'0';
- i++;
- }
- ///////转换存储顺序
- na = i; //保存数组中存入了多少个有效元素 na-1个
- for (int k=0,i=na-1; i>=0; i--) // //下标小的保存低位
- {
- a[i] = a1[k];
- k++;
- }
- cout<<"输入被加数:";
- while ( (b1[j]=getchar()) !=' ' )
- {
- b1[j] = b1[j]-'0';
- j++;
- }
- nb = j; //保存数组中存入了多少个有效元素 nb-1个
- ///////转换存储顺序
- for (int k=0,j=nb-1; j>=0; j--) // //下标小的保存低位
- {
- b[j] = b1[k];
- k++;
- }
- ////////////////////////// 取得保存相加结果数组的长度////////////////
- /* 如输入123+23 我们就要取大数字的位数作为 保存结果数组的小标 不这样就会丢失数据
- */
- int lengh ; //取数组元素最长的作为保存相加后的结果
- if (na>=nb)
- {
- lengh = na;
- }
- else
- {
- lengh = nb;
- }
- ////////////////////////// 开始执行加法操作////////////////
- for (int m=0; m<lengh; m++)
- {
- a[m] = a[m] + b[m]; //两数进行相加 每一位相加
- }
- ///////////////////////////进位处理 ///////////////////////////////
- /*如 98+7 就要进位
- 数据保存如下:
- a[0]=8 ,a[1]=9; b[0]=7 执行上面的相加操作 结果为:
- a[0]=a[0]+b[0]=15 ,a[1]=a[1]+b[1] = 9+0=9
- 下面为进位处理 lengh =2
- a[0]=15 a[1]=9
- 1. n=0 a[0]>9 需进位
- temp=15/10=1 a[1]=a[1]+temp =9+1=10 a[0]=15%10=5
- 2.n=1 a[1]=10>9 continue
- temp = 10/10=1 a[2]=0+1=1 a[1]=10%10=0
- 3.n=2 等于lengh 所有退出
- 这时相加的结果为:a[0]=5 a[1]=0 a[2]=1
- 输出就是105
- */
- for (int n=0; n<lengh; n++) //进位处理
- {
- if (a[n] >9)
- {
- int temp = a[n]/10;
- a[n+1] = a[n+1] + temp;
- a[n] = a[n]%10;
- ncount = lengh; //进位的话 数组要多一位数字 ,实际上主要是判别是否是最后一位进位
- }
- else
- {
- ncount = lengh-1; //不进位保存结果的数组长度就是 输入数字大的位数长
- continue; //不进位就往下走
- }
- }
- //////////////////////输出结果///////////////////////////////
- cout<<"相加结果是:";
- for (int i=ncount; i>=0; i--) //ncout 解决了显示输出结果问题:可能会出现少位数或多位数
- {
- cout<<a[i];
- }
- cout<<endl;
- system("pause");
- return 0;
- }