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

    在实现简单的加法时,我们大都会采用直接相加输出结果,但是如果两个数非常大,已经超出了c++基本数据类型的表示范围时,该如何解决?

    c++几种基本数据类型:

    int             整型 		4字节 范围:-2147483648 ~ 2147483647
    float         	实型(单精度) 	4字节 范围:1.18*10@-38 ~ 3.40*10@38    7位有效位(多少次方符号不能显示,以@代替,下同
    double     	实型(双精度) 	8字节 范围:2.23*10@-308 ~ 1.79*10@308  15位有效位
    可见,如果需要计算大数相加,这些基本类型能力也有限。

    现提供一种方法解决大数相加,基于String字符串,大家都知道,String可以表示很长的字符,String 的长度可以是零个字符至大约二十亿个字符。将需要相加的数存为String类型,在想办法将两个数相加即可解决问题。如果学过数据结构,可以有更好的解决方法,如尝试使用链表等可以解决问题,大数相乘等,同样可以使用链表等数据结构解决。

    示例:计算123456789987654321+987654321012345 = ?时,先将两个加数存为String类型,再从两个加数的末尾开始,一个数一个数的相加,跟做普通加法一个原理,只是这里需要注意的是,两个加数的类型为字符串,所以如果将其中的数字直接相加,其实是不对的如,如上述问题,中末尾分别为1和5,如果直接相加,则是字符在相加如:

    string a1 = "1";
    string a2 = "5";
    cout<<a1 + a2<<endl;

    输出结果为:


    很显然这不是我们需要的答案,我们想要的是1+5=6;

    这里有一个解决方法:在计算的时候将每一个数都减去字符‘0’,这样得到的即为我们需要的数。

    c++代码如下:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    void main()
    {
    	string a1 ;
    	string a2 ;
    	cout<<"请输入需要相加的两个大数:"<<endl;
    	cout<<"加数:"<<endl;
    	cin>>a1;
    	cout<<"被加数:"<<endl;
    	cin>>a2;
    	
    	string res;
    	int OneAdd = 0;//
    	int temp2  = 0;//
    	int temp   = 0;
    	int min    = a1.length()<a2.length() ? a1.length() : a2.length();//比较两个字符串,取较小一个的长度
    
    	for(int i=1; i<=min; i++)
    	{
    		OneAdd = (a1[a1.length() - i] - '0' + a2[a2.length() - i] - '0') + temp;
    		temp = OneAdd/10;			//需要向前一位的数,如9+8=17,进一位:1
    		temp2 = OneAdd % 10;		//需要保留的,如9+8=17,保留7
    		res.push_back(temp2 + '0');	//将每次保留的数存入结果字符串,注意顺序是反的,结果需倒置输出
    	}
    
    	//将余下的直接添加到结果,注意前面可能前进一位
    	while(a1.length() > min)
    	{
    		OneAdd = a1[a1.length()-1 - min] - '0' + temp;
    		temp = OneAdd/10;			
    		temp2 = OneAdd % 10;
    		res.push_back( temp2 + '0' );
    		min++;
    	}
    	while(a2.length() > min)
    	{
    		OneAdd = a2[a2.length() - 1 - min] - '0' + temp;
    		temp = OneAdd / 10;
    		temp2 = OneAdd % 10;
    		res.push_back( temp2 + '0' );
    		min++;
    	}
    
    	//将res反向输出
    	cout<<"结果:"<<endl;
    	for(int i=res.length()-1; i>=0 ;i--)
    	{
    		cout<<res[i];
    	}
    	cout<<endl;
    }
    如有疑问请留言!
    附上源代码链接:http://download.csdn.net/detail/shanchuan2012/6977551
     

  • 相关阅读:
    [HNOI2006]超级英雄
    [CTSC1999]家园
    火星探险问题
    [HNOI2008]GT考试
    [USACO14DEC]后卫马克Guard Mark
    [NOI2018]归程
    [USACO15DEC]最大流Max Flow
    [NOIPlus]斗地主
    [LUOGU] P3128 [USACO15DEC]最大流Max Flow
    [BZOJ] 1878: [SDOI2009]HH的项链
  • 原文地址:https://www.cnblogs.com/shanchuan/p/8150365.html
Copyright © 2011-2022 走看看