zoukankan      html  css  js  c++  java
  • 【hdoj_1002】A+B Problem ||(大数)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1002


    题目提示,相加的两个数的位数可能很大(最多可达1000位),而int最多32位,long long类型和__int64类型都是最多64位,均不能存储位数过多的数,所以现有的数据类型无法直接存储.


    思路:用字符串存储输入的数字,模拟加法的过程,即相加和进位的过程.


    首先,来看一下,加法以及进位的原理,以便后面[核心代码]的理解.


    No.1   6 + 7 = 13——>1和3,第一位写3,进位为1

    No.2   8 + 3 = 11——>11 + No.1中的进位1 = 12——>1和2,第二位写2,进位为1

    No.3   9 + 0 = 9——>9 + No.2中的进位1 = 10——>1和0,第三位写0,进位为1

    No.4   7 + 4 = 11——>11 + No.3中的进位1 = 12——>1和2,第四位写2,进位为1

    No.5   0 + 0 = 0——>0 + No.4中的进位1 = 1——>0和1,第五为写1,没有进位,结束


    由于两数的第一位没有进位可以加,所以直接是对应的两数相加,取余数就是3.从第二位开始,对应数加完之后,还要与前面的的进位的数(1或者0)相加,再取余数,才是这一位的数.


    下面思考,如何写代码?

    1.用字符串(string类对象)表示输入的数.

    2.给定输入的两个数x和y(用string类型x和y存储),应该作如下处理


    图示做了两个方面处理,(1)对齐,方便对应位置的数字进行加法运算.(2)在最前面还加了一个0,给可能存在的进位预留一个位置,例如99+1,结果的位数为3位.

    3.在进行加法的时候,逆序(从低位开始)进行.


    C++代码如下

    #include<iostream>
    #include<string>
    using namespace std;
    
    #define max(a,b) (a>b?a:b)//类似于定义一个函数求二者中的较大者
    
    int main()
    {
    	//freopen("in.txt","r",stdin);//调试用
    	int T;
    	cin >> T;//T组数据
    	for(int t=1;t<=T;t++)
    	{
    		string x,y;
    		cin >> x >> y;//输入两个数
    
    		//结果输出时的格式控制
    		cout << "Case " << t << ":" << endl;
    		cout << x << " + " << y << " = ";
    		
    		int xL = x.length();//x的长度
    		int yL = y.length();//y的长度
    
    
    		if(xL<yL)//如果x的位数小,则交换,因为最后统一将结果存储在x中
    		{
    			x.swap(y);//交换内容
    
    			int len = xL;//因为后面要用到yL,所以长度也要交换
    			xL = yL;
    			yL = len;
    		}
    
    		//到这里x一定是长度较长的那个
    
    		int L = max(xL,yL) + 1;//结果的长度为x和y的最大长度+1(此处L的值其实就是xL+1)
    
    		x = '0' + x;//x的前面添加一个0
    
    		int i,j;//循环变量
    
    		for(i=yL+1;i<=L;i++)//使x和y的长度一样
    			y = '0' + y;//添加0
    
    		//下面开始加法运算了
    		int c = 0;//记录进位:c=1或者c=0
    		for(i=L-1;i>=0;i--)//从右边加到左边
    		{
    			int z = x[i]-'0';//获取x[i]对应的字符对应的数字,例如x[i] = '6',则x[i]-'0'就是int型的6.
    			int w = y[i]-'0';
    			int h = z + w + c;//下面三行代码是[核心代码],描述加法的过程
    			c = h / 10;
    			x[i] = h%10 + '0';
    		}
    		
    		//输出预处理:找到从什么开始没有0(去除前导0)
    		for(i=0;i<L;i++)
    			if(x[i]!='0')
    				break;
    		for(j=i;j<L;j++)//输出
    			cout << x[j];
    		cout << endl;
    
    		if(t!=T)//空行
    			cout << endl;
    	}
    
    	return 0;
    }
    上述代码,提交可以通过.


    小结:

    1.调试小技巧:在主函数开始写 freopen("in.txt","r",stdin);     其中in.txt为cpp文件同目录下的输入数据.

    2.宏定义的使用:#define max(a,b) (a>b?a:b)   不需要写数据类型

  • 相关阅读:
    Django视图
    Django模板系统
    错误:java.sql.SQLException: Access denied for user 'xxx'@'localhost' (using password: YES)
    关于Spring使用XML配置AOP时pointcut位置的一个小问题
    在jsp页面中将Java对象转换位JS对象的一个思路
    关于artifact XXXX:war exploded: Error during artifact deployment. See server log for details.错误
    框架集合——Java面向对象基础(33)
    使用Socket简单模拟C/S消息传递(UDP)——Java面向对象基础(32)
    使用Socket简单模拟C/S消息传递(TCP)——Java面向对象基础(31)
    对象序列化——Java面向对象基础(30)
  • 原文地址:https://www.cnblogs.com/tensory/p/6590753.html
Copyright © 2011-2022 走看看