zoukankan      html  css  js  c++  java
  • 洛谷P1601 A+B Problem(高精)

    题目描述

    高精度加法,x相当于a+b problem,[b][color=red]不用考虑负数[/color][/b]

    输入输出格式

    输入格式:

    分两行输入a,b<=10^500

    输出格式:

    输出只有一行,代表A+B的值

    输入输出样例

    输入样例#1: 复制

    1
    1

    输出样例#1: 复制

    2

    思路:显而易见是通过数组来模拟,之前写过类似的,直接用了,不过以前写的太差了。

    #include<iostream>
    #include<algorithm>
    #include<string>
    #include<cmath>
    using namespace std;
    int main()
    {                                          //肯定不是最优的,而且还很冗长,是我太菜了
    	string a, b;
    	char c[1000];                       //这里要用到char,因为我vs过不了,嘤嘤嘤
    	int t, i, j, lag , m, o = 1, n;     //lag是进位,m是c数组的下标,用n赋值为t,下面会解释
    	//cin >> t;
    	//n = t;
    	//while (t--)
    	//{
    		cin >> a >> b;
    		m = 0; lag = 0;             //下面会将两个字符串相加一直到其中一个结束,因为位数不一定相等
    		for (i = a.size() - 1, j = b.size() - 1; i >= 0 && j >= 0; i--, j--)
    		{                                           //size函数是计算字符串长度的
    			c[m] = a[i] + b[j] - 48 + lag;      //根据asc码来运算,lag为进位
    			lag = 0;                            //赋值0,只有有进位时才为1
    			if (c[m]>57)
    			{
    				c[m] -= 10;
    				lag = 1;
    			}
    			m++;
    		}
    		if (a.size() == b.size())          //如果字符串长度相等,证明已经相加结束,只判断最高位是否有进位
    		{
    			if (lag)                   //如果有,那么最高位只会为1
    				c[m++] = 49;
    		}
    		if (a.size()>b.size())             //如果第一个字符串长,那么继续拿进位和第一个字符串相加,
    		{                                  //比如说123+9,3与9相加后,1,2要继续和进位相加
    			if (lag)                   //两种情况,第一种,有进位
    			{
    				for (; i >= 0; i--)  //i不用赋初值,因为i即为上次相加的位置
    				{
    					c[m] = a[i] + lag;
    					if (c[m] > 57)   //这里应该不难理解
    					{
    						c[m] -= 10;
    						lag = 1;
    					}
    					else
    						lag = 0;
    					m++;
    				}
    				if (lag)                //这是最高位计算后,再判断最高位是否有进位
    					c[m++] = 49;
    			}
    			else                          //第二种情况,没有进位,则保持原值不用再计算
    			{
    				for (; i >= 0; i--)
    					c[m++] = a[i];
    			}
    		}
    		if (a.size()<b.size())                //当第二个字符串位数较多时同上
    		{
    			if (lag)
    			{
    				for (; j >= 0; j--)
    				{
    					c[m] = b[j] + lag;
    					if (c[m] > 57)
    					{
    						c[m] -= 10;
    						lag = 1;
    					}
    					else
    						lag = 0;
    					m++;
    				}
    				if (lag)
    					c[m++] = 49;
    			}
    			else
    			{
    				for (; j >= 0; j--)
    					c[m++] = b[j];
    			}
    		}
    		//cout << "Case " << o << ":" << endl;    //最后要说一下输出,要严格按照题目要求,注意数字间有空格
    		//cout << a << " + " << b << " = ";
    		for (i = m - 1; i >= 0; i--)
    			cout << c[i];
    		cout << endl;                          //每组数据最后都要换行,endl就是换行的意思,但每两组数据间要空上一行
    		//if (o<n)                               //所以要用到n,假如有3组数据,o初值为1,所以只有为1,2时才空行,即1与2,2与3之间空行
    			//cout << endl;
    		//o++;
    	//}
    	return 0;                                      //光A题题解就写到12点了,睡觉喽
    }
    
  • 相关阅读:
    python 查看所有的关键字
    使用yum命令报错File "/usr/bin/yum", line 30 except KeyboardInterrupt, e: SyntaxError: invalid syntax问题
    安装Python3.6.2报错:zipimport.ZipImportError: can't decompress data; zlib not available
    在CentOS-7.0中安装Python3.6.2
    批处理基础
    linux创建线程之pthread_create
    嵌入式 printf函数
    滤波算法
    单片机启动文件
    SUID、SGID详解
  • 原文地址:https://www.cnblogs.com/aerer/p/9930953.html
Copyright © 2011-2022 走看看