• 大数加法


    题目描述

    求两个不超过200位的非负整数的和。

    输入

    有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。

    输出

    一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

    样例输入

    22222222222222222222
    33333333333333333333

    样例输出


    55555555555555555555


    本来想用一个函数来相加,但发现不能正确传递,这个问题(数组名作函数参数)下次解决。

    #include <iostream>
    #include <string>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    char a[205]; int la;
    char b[205]; int lb;
    char c[205]; int l;
    //int jjj(char xx[], char yy[])//不知道怎么传递,伤心
    //{
    //	int i;
    //	int x=0, y=0;
    //	for (i = l - 1; i >= 0; i--)
    //	{
    //		int s;
    //		s = xx[i] - '0' + yy[i] - '0' + x;
    //		if (s >= 10)
    //		{
    //			x = s / 10; c[i] = s % 10 + '0';
    //		}
    //	}
    //	return x;
    //}
    int main()
    {
    
    	cin >> a; cin >> b;
    	la = strlen(a);
    	lb = strlen(b);
    	l = max(la, lb);
    	int i;
    	//以下这一步,我是为了让两个字符数组的个数相同,
    	//短的字符数组,前面用0补齐
    	//同时,为了统一,两个相加的字符数组分别变为数组c和数组a
    	if (la >=lb)
    	{
    		for (i = 0; i <= la - lb - 1; i++) c[i] = '0';
    		for (i = la - lb; i < la; i++)
    			c[i] = b[i - (la - lb)];
    
    	}
    	else if (lb > la)
    	{
    		for (i = 0; i <= lb - la - 1; i++)   c[i] = '0';
    		for (i = lb - la; i < lb; i++)  c[i] = a[i - (lb - la)];
    		for (i = 0; i < lb; i++) a[i] = b[i];
    	}
    	int x = 0, y = 0;
    	memset(b, 0, sizeof(0));//数组b用来存放最终答案
    	for (i = l - 1; i >= 0; i--)//从个位开始加
    	{
    		int s;
    		s = c[i] - '0' + a[i] - '0' + x; 
    		x = 0;//这一步太重要,没有这一步过不了样例:0342+888888;
    		//因为百位,8+3为11,x为1;x不清零的话,千位会变成9,但实际上应该是8
    		if (s >= 10)
    		{
    			x = s / 10; //x为要进上去的数,比如个位13,3留下,1进上
    			b[i] = s % 10 + '0';
    		}
    		else b[i] = s + '0';
    	}
    	if (x != 0)//最后1个x就是最高位的数
    	{
    		cout << x;
    		for (i = 0; i < l; i++) cout << b[i];
    	}
    	else//注意前导0的情况
    	{
    		bool f = 1;
    		for (i = 0; i < l ; i++)
    		{
    			if (f == 0) cout << b[i];//x为0,即最高为0,只后还是0的话就不要输出了
    			//f==0代表之前有一位不是0,那么后面几位都可以放心输出,比如100010
    			if (f == 1 && b[i] != '0') 
    			{ f = 0; cout << b[i]; }
    
    		}
    	}
    	cout << endl;
    	return 0;
    }
    


  • 相关阅读:
    android 开发中java.lang.verifyerror问题
    android 获取当前系统及应用信息(一)
    Android排错:has leaked window com.android.internal.policy.impl.PhoneWindow$ that was originally added here
    Android 自定义menu(一)
    产品经理的技术之痛
    内容营销11金规
    剑指Offer:名企面试官精讲典型编程题
    内容营销——网络营销的杀手级武器
    产品经理应该具有的几个工作态度
    产品经理如何提升自己的知识
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/13271320.html
Copyright © 2020-2023  润新知