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

    //大数加法
    
    /*
    1、输入,char转int,然后反转数组
    2、找长度长的为相加后数组的长度
    3、相加得到的数据可以放在一个新的数组里,也可以放在长度长的那个数组里(这时候要注意长度)
    4、我傻逼了,其实直接相加,不管a[i]+b[j]得到的数大于9,因为一个数组元素存放的数有 int那么大呢
    5、对相加后的数进行处理,进位操作
    6、输出时因为是从高位输出,所以要注意输出多余的0,比如0013241;
    */
    
    /* 
    大数相加:超越数据类型范围的也可以进行相加
    
    分析: 用一维数组解决 :
    
    1.数据元素的输入 用getchar无限输入字符 ,从下标0开始 保存元素 保存顺序是高位在前,低位在后,输入123
    保存a1[0]=1....这里也要把字符转换为整形,关系 整数1+'0' ='1' 
    
    2.一但遇到进位问题,上面这种就会溢出,数据无法完全保存,所有 把上面的存储顺序改成是 低位在前,高位在后
    如输入123 a[0]=3,a[1]=2 
    
    3.相加操作 :把每一位进行相加 这里用已存在的数字对相加结果进行保存,输入的数可能长度不一,所有数组长度要
    取最输入最长的
    
    4.相加进位问题:因是每一位相加,结果可能会大于9,大于9的就要进行进位操作,其它的不变
    
    5.显示输出结果问题:可能会出现少位数或多位数的,这里就用一变量ncount解决    
    
    */
    
    //From Net
    
    #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=0,j=0;
    
        ////////////////////输入数据////////////////////////////// 
        cout<<"请输入加数:";
    
        while ( (a1[i]=getchar()) !='
    ' )   //下标小的保存高位 
        { 
            a1[i] = a1[i]-'0'; //把字符转换为整形存放回a1数组里
            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里面
        {
            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=na>nb?na: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. i=0 a[0]>9 需进位
        temp=15/10=1   a[1]=a[1]+temp =9+1=10   a[0]=15%10=5
    
        2.i=1 a[1]=10>9 continue
        temp = 10/10=1  a[2]=0+1=1   a[1]=10%10=0
    
        3.i=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;
    }
  • 相关阅读:
    项目计划和进度的管理之读书笔记
    美团,点评,澎湃等APP的启示
    产品曝光策略及渠道整理(一)
    产品信息架构的思考
    理解交互设计之"行为设计与对象设计"
    从市场运营角度谈Uber中国的第一批用户是怎么来的
    行业分析方向与框架
    行业分析报告的渠道和资料来源
    es6中的部分新特性
    解决微信开发工具在每次保存时自动刷新到首页的问题
  • 原文地址:https://www.cnblogs.com/tianjintou/p/4192099.html
Copyright © 2011-2022 走看看