zoukankan      html  css  js  c++  java
  • 大整数相加

    转载:http://www.du52.com/text.php?id=411

    在这个大数据的年代里,我们不可避免会遇到两个超越正常数据类型(如int,long,long long)的整数相加。显然两个大数据已经不能使用传统的加号直接相加,但是相加的原理仍然是不变的,就是简单的同位相加,超9进1.接下来我们将叙述用数组保存的大数据相加的代码。

    [cpp] view plain copy
    1. /*  
    2.  大数相加:超越数据类型范围的也可以进行相加 
    3.   
    4.  分析: 用一维数组解决  
    5.  1.数据元素的输入 用getchar无限输入字符 ,从下标0开始 保存元素 保存顺序是高位在前,低位在后,输入123 
    6.  保存a1[0]=1....这里也要把字符转换为整形,关系 整数1+'0' ='1'  
    7.    
    8.    2.一但遇到进位问题,上面这种就会溢出,数据无法完全保存,所有 把上面的存储顺序改成是 低位在前,高位在后 
    9.  如输入123 a[0]=3,a[1]=2  
    10.   
    11.  3.相加操作 :把每一位进行相加 这里用已存在的数字对相加结果进行保存,输入的数可能长度不一,所有数组长度要 
    12.  取最输入最长的 
    13.   
    14.  4.相加进位问题:因是每一位相加,结果可能会大于9,大于9的就要进行进位操作,其它的不变 
    15.   
    16.  5.显示输出结果问题:可能会出现少位数或多位数的,这里就用一变量ncount解决  
    17.   
    18.    
    19.  
    20. */  
    21. #include<iostream>  
    22. using namespace std;  
    23.   
    24. int main()  
    25. {  
    26.     int a1[100];  
    27.     int b1[100];  
    28.     int a[100]={0};  
    29.     int b[100]={0};  
    30.     int na ,nb;       //保存数组元素的长度   
    31.     int ncount = 0;    //相加后的数组共有多少个元素   
    32.       
    33.     int i,j;  
    34.     i = 0;  
    35.     j = 0;  
    36.       
    37.       
    38.     ////////////////////输入数据//////////////////////////////   
    39.     cout<<"请输入加数:";  
    40.     while ( (a1[i]=getchar()) !=' ' )   //下标小的保存高位   
    41.     {   
    42.           a1[i] = a1[i]-'0';  
    43.           i++;  
    44.     }  
    45.       
    46.     ///////转换存储顺序   
    47.     na = i;    //保存数组中存入了多少个有效元素 na-1个   
    48.     for (int k=0,i=na-1; i>=0; i--)  // //下标小的保存低位   
    49.     {  
    50.         a[i] = a1[k];  
    51.         k++;  
    52.     }  
    53.           
    54.   
    55.     cout<<"输入被加数:";  
    56.     while ( (b1[j]=getchar()) !=' ' )  
    57.     {  
    58.           b1[j] = b1[j]-'0';  
    59.           j++;  
    60.     }  
    61.       
    62.     nb = j;    //保存数组中存入了多少个有效元素 nb-1个  
    63.       
    64.     ///////转换存储顺序   
    65.     for (int k=0,j=nb-1; j>=0; j--)  // //下标小的保存低位   
    66.     {  
    67.         b[j] = b1[k];  
    68.         k++;  
    69.     }  
    70.       
    71.       
    72.     ////////////////////////// 取得保存相加结果数组的长度////////////////  
    73.     /* 如输入123+23 我们就要取大数字的位数作为 保存结果数组的小标 不这样就会丢失数据  
    74.     */   
    75.       
    76.     int lengh ; //取数组元素最长的作为保存相加后的结果  
    77.     if (na>=nb)  
    78.     {  
    79.         lengh = na;  
    80.     }   
    81.     else  
    82.     {  
    83.         lengh = nb;  
    84.     }  
    85.       
    86.       
    87.     ////////////////////////// 开始执行加法操作////////////////  
    88.     for (int m=0; m<lengh; m++)  
    89.     {  
    90.         a[m] = a[m] + b[m];   //两数进行相加  每一位相加   
    91.     }   
    92.       
    93.     ///////////////////////////进位处理 ///////////////////////////////  
    94.     /*如 98+7 就要进位  
    95.     数据保存如下: 
    96.        a[0]=8 ,a[1]=9;  b[0]=7  执行上面的相加操作  结果为:  
    97.        a[0]=a[0]+b[0]=15 ,a[1]=a[1]+b[1] = 9+0=9 
    98.         
    99.        下面为进位处理  lengh =2 
    100.        a[0]=15   a[1]=9 
    101.        1. n=0 a[0]>9 需进位 
    102.          temp=15/10=1   a[1]=a[1]+temp =9+1=10   a[0]=15%10=5 
    103.           
    104.        2.n=1 a[1]=10>9 continue 
    105.          temp = 10/10=1  a[2]=0+1=1   a[1]=10%10=0 
    106.         
    107.        3.n=2  等于lengh 所有退出  
    108.        这时相加的结果为:a[0]=5  a[1]=0    a[2]=1   
    109.        输出就是105  
    110.     */  
    111.     for (int n=0; n<lengh; n++)  //进位处理   
    112.     {  
    113.       if (a[n] >9)  
    114.       {  
    115.           int temp = a[n]/10;  
    116.           a[n+1] = a[n+1] + temp;  
    117.           a[n]   = a[n]%10;  
    118.           ncount = lengh;      //进位的话 数组要多一位数字 ,实际上主要是判别是否是最后一位进位  
    119.       }  
    120.       else  
    121.       {  
    122.           ncount = lengh-1;    //不进位保存结果的数组长度就是 输入数字大的位数长   
    123.           continue;     //不进位就往下走   
    124.       }   
    125.     }  
    126.       
    127.   
    128.     //////////////////////输出结果///////////////////////////////   
    129.       
    130.       
    131.     cout<<"相加结果是:";  
    132.     for (int i=ncount; i>=0; i--)  //ncout 解决了显示输出结果问题:可能会出现少位数或多位数   
    133.     {  
    134.         cout<<a[i];  
    135.     }  
    136.     cout<<endl;   
    137.     system("pause");  
    138.     return 0;  
    139. }  
  • 相关阅读:
    UIView用户事件响应
    登录模块之静态登录
    对C# 中Readonly的再认识
    [Android学习笔记4]四大应用组件之一:Service 上
    修改XPMenu让ToolButton在Down=True时正确显示
    通过程序预览Office文档
    发掘ListBox的潜力(三):显示即时提示(Tips)
    从网络上下载文件的两种方法
    解决窗体闪烁问题的方法
    C/C++中动态链接库的创建和调用
  • 原文地址:https://www.cnblogs.com/wyboooo/p/9643459.html
Copyright © 2011-2022 走看看