现在的位置: 首页 > 综合 > 正文

大数相加

2013年09月21日 ⁄ 综合 ⁄ 共 2676字 ⁄ 字号 评论关闭

*26-05-10 12:37
求两个超长正整数的和,如100个1+100个2
思路:用数组实现
 1 数据的输入:用cin不嫩保存数据,这里考虑用获取一个字符函数getchar(),只有不安回车键,就连续可以输入
 2 数据的保存:每输入一个字符就进行保存,记住输入的可是字符型,咋办,用字符的ASCII关系进行解决,
 字符'0'的ASCII为整数的48,比如获取一个字符1,'1'=49,'1'-'0'=1,这样就把他转换为了整数了,然后保存在数
 组中,从0开始,一位一位往后推,这样高位就在前,低位在后了,这样久保证个位和十位分别可以相加了
 
 3 逻辑加:两个数进行相加可能会有进位,如何解决,把相加的两数除以10(加法中进位只会大于10)保存于一变
 量中,在对相加的数取模保存个位,最后,把个位和进位相加,还有就是怎样保证个位和个位加,十位和十位加
 ,这就要利用数组下标进行计算了
 4 和数的保存:最后保存存在一个问题,数组长度够长,而输入的数字没有完全占用完,还有些空余的怎么处理
 这就要算出数组的长度
*/
#include<iostream>

using namespace std;
int main()
{
    int a[200] ={0} ;  //保存加数
    int b[200] = {0};  //保存被加数
    //i=1,j=1,? 因为最后一位进位要一个字节空间,这里特意留的第一个空间不保存加数和别加数
    int i=1,j=1,k=0;  
   
    int result = 0;    //保存进位后的值
    int g;              //标志数组a[0],b[0]是否为非空
   
    cout<<"          根据提示输入正整数,输入字母程序将会中止退出!   "<<endl;
    cout<<"请输入加数:";
   
    while ( (a[i]=getchar()) !='/n' )   
    {
          if ( (a[i]>='a' && a[i]<='z') || (a[i]>='A' && a[i]<='Z') )
          {
              exit(0);
          }
          else
          {
              a[i] = a[i]-'0';    //这里就用到ASCII 码的技巧,把字符很好的转换成了整形值然后保存整形
                                  //数组
              i++;
          }
    }
   
    cout<<"请输入被加数:";
    while ( (b[j]=getchar()) !='/n' )
    {
          if ( (b[j]>='a' && b[j]<='z') || (b[j]>='A' && b[j]<='Z') )
          {
               exit(1);
          }
          else
          {
              b[j] = b[j]-'0';
              j++;
          }
    }
 /*
   这里用到了一个技巧,没有定义保存计算后和的数组,而是直接利用了保存加数和被加数的数组
   当然,输入两数,他们的长度可能不同,这里当然以数据长的那一个数组作为标准了
   如果加数的位数长于被加数,则把和值保存在加数的数组中,否则相反了
 */ 
   
    if (i>=j)     //数组a的长度大于或等于数组b的长度
    {
        k = i;
        for (; j>0; )
        {
         /*a保存的是12,b是2 结果是14
         1. result = 14/10=1 ,a[k-1](i最末的哪一位)=4  ,a和b数组下标都自减1 这时它和下面的 a[k-1]
         就不是同一值了,,result和a[k-1]加不对啊,但要知道,除10它的位置就是向高位进一位了哦
         
         */
                result  = (a[k-1]+b[j-1])/10;
                a[k-1]  = (a[k-1]+b[j-1])%10;
                k--;
                j--;
                a[k-1]  = a[k-1]+ result;
        }
         
          if (a[0]==0)
          {
              g=1;
          }
          else
          {
              g=0;
          }
        cout<<"两数相加结果为:";
       
        /*  和的保存和加数被加数是一样的,即位数大的保存在数组低位,但是有一点,数组a[0]是空的,
        有时你输入的数相加后最后一位没进位,那它同样会输出一个0,这里既有用g作为标准了
        */
        for ( int h=g; h<i; h++ )
        {
            cout<<a[h];
        }
        cout<<endl;
    }
   
    
    else  //数组a的长度大小于数组b的长度 ,这时以b数组作为相加后和的保存数组
    {
        k=j;
        for (; i>0; )
        {
            result  = (a[i-1]+b[k-1])/10;
            b[k-1]  = (a[i-1]+b[k-1])%10;
            k--;
            i--;
            b[k-1]  = b[k-1]+ result;
        }
        if (b[0]==0)
          {
              g=1;
          }
          else
          {
              g=0;
          }
        
        cout<<"两数相加结果为:";
        for ( int h=g; h<j; h++ )
        {
            cout<<b[h];
        }
        cout<<endl;
    }
       
    system("pause");
    return 0;
}

抱歉!评论已关闭.