• 洛谷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点了,睡觉喽
    }
    
  • 相关阅读:
    c++函数模板
    C++左移运算符重载
    and or bool and a or b 原理解释
    Python的垃圾回收机制
    《C++ 101条建议》学习笔记——第一章快速入门
    在应用中嵌入Python:转
    使用C++扩展Python的功能 转自:http://blog.csdn.net/magictong/article/details/8897568#comments
    python扩展实现方法--python与c混和编程 转自:http://www.cnblogs.com/btchenguang/archive/2012/09/04/2670849.html
    python文件头的#-*- coding: utf-8 -*- 的作用
    Pythhon 字典 key in dict 比 dict.has_key (key)效率高 为什么?
  • 原文地址:https://www.cnblogs.com/aerer/p/9930953.html
Copyright © 2020-2023  润新知