zoukankan      html  css  js  c++  java
  • 牛客网-趋势科技-2020届校园招聘上机考试-1

    输入描述:
    输入为两个非负数,每个数满足下面要求:
    (1)仅包含0-9的数字,0或1个小数点“.”;
    (2)长度不大于200;
    (3)不需判错。
    输出描述:
    输出为两数之和

    1.思考

    • 一开始把问题想得太简单,可以直接将string转换为int/double,然后进行简单的数字相加。思考过程中出现两个错误:
      (1)以为小数是纯小数,即整数部分为0,所以只要判断s[1]=='.'就可以知道是否是小数了,太想当然了;
      (2)没注意到长度是200以内的,即不能讲string的数转化为int/double,会溢出;
    • 后来再看题目发现之前的问题,并进行思考:
      (1)由于长度是200以内,所以只能进行字符串的相加减;
      (2)由于输入的数可能有整数也有小数,所以要分情况讨论,可以通过s.find('.')确定情况:小数+小数,小数+整数,整数+小数,整数+整数;
      (3)思考最难情况,即“小数+小数”,主要有三部分计算:小数点左半部分整数相加AddInte(),小数点右半部分小数相加AddFrac(),小数相加后的进位与整数部分相加;其他情况都是这三部分计算中的某些部分,即该情况涵盖了所有可能出现的相加状况;
      (4)其中,整数和小数的相加都是将两个数对齐,整数是字符串向右对齐,小数是字符串向左对齐,截取相同长度进行相加。整数出现进位,再将进位与更高位相加;小数出现进位,再将进位与整数部分相加。
    • 涉及函数的作用如下:
      (1)Add():两字符串相加,确定当前字符串的情况,通过find('.')将情况分为4种:小数+小数,小数+整数,整数+小数,整数+整数;并将所有的小数都分成整数部分和小数部分,分开进行相加;
      (2)AddInte():整数相加,字符串向右对齐,对齐部分通过AddNum()相加;若存在进位,则进位再与更高位在执行AddInte()操作;最后将前后两段拼接在一起;
      (3)AddFrac():小数相加,字符串向左对齐,对齐部分通过AddNum()相加;然后将后半部分拼接在一起;其中进位到整数部分再使用AddInte()进行处理;
      (4)AddNum():相同长度的两整数相加。

    2.实现

    #include <iostream>
    #include <string>
    using namespace std;
    
    #define MAX(a,b) ((a>b)?a:b)
    
    string AddNum(string s1, string s2){//相同长度的两数相加
    	string res, s;
    	int len = s1.size();
    	int n = 0, c = 0;
    	for (int i = len - 1; i >= 0; i--){
    		n = (s1[i] - '0') + (s2[i] - '0') + c;
    		if (n > 9){
    			c = n / 10;
    			s = '0' + (n % 10);
    		}
    		else{
    			c = 0;
    			s = '0' + n;
    		}
    		res = s + res;
    	}
    	if (c > 0){
    		char cr = '0' + c;
    		res = cr + res;
    	}
    	return res;
    }
    
    string AddFrac(string s1, string s2){//两个小数部分相加
    	int l1 = s1.size(), l2 = s2.size();
    	int len, maxlen, minlen;
    	string f1, f2, res;
    
    	//先确定两个小数的长度
    	if (l1 > l2){
    		len = l1;
    		maxlen = l1;
    		minlen = l2;
    		f1 = s1;
    		f2 = s2;
    	}
    	else{
    		len = l2;
    		maxlen = l2;
    		minlen = l1;
    		f1 = s2;
    		f2 = s1;
    	}
    
    	//将位数更长的小数分成两部分
    	string f11 = f1.substr(0, minlen);//与位数更短相加的前半部分
    	string f12 = f1.substr(minlen, maxlen - minlen);//剩余后半部分
    
    	string r1 = AddNum(f11, f2);
    	int lr = r1.size();
    	res = r1 + f12;
    	
    	return res;
    }
    
    string AddInte(string s1, string s2){//两个整数部分相加
    	int l1 = s1.size(), l2 = s2.size();
    	int len, maxlen, minlen;
    	string i1, i2, res, n1, n2;
    	
    	//先确定两个整数的长度
    	if (l1 > l2){
    		len = l1;
    		maxlen = l1;
    		minlen = l2;
    		i1 = s1;
    		i2 = s2;
    	}
    	else{
    		len = l2;
    		maxlen = l2;
    		minlen = l1;
    		i1 = s2;
    		i2 = s1;
    	}
    
    	//将位数更长的小数分成两部分
    	string i11 = i1.substr(maxlen - minlen, minlen);//与位数更短相加的后半部分
    	string i12 = i1.substr(0, maxlen - minlen);//剩余前半部分
    
    	string r1 = AddNum(i11, i2);
    	int lr = r1.size();
    
    	if (lr > minlen){//小数部分存在进位
    		//将小数进位与整数和进行两个整数相加操作
    		n1 = AddInte(i12, r1.substr(0, lr - minlen));
    		res = n1 + r1.substr(lr - minlen);
    	}
    	else{
    		res = i12 + r1;
    	}
    
    	return res;
    }
    
    string Add(string s1, string s2){
    	int d1 = s1.find('.');
    	int d2 = s2.find('.');
    	string i1, i2;
    	string f1, f2;
    	string n1, n2;
    	string res;
    
    	if (d1 > 0 && d2 > 0){//两个都是小数
    		i1 = s1.substr(0, d1);
    		f1 = s1.substr(d1+1);
    		i2 = s2.substr(0, d2);
    		f2 = s2.substr(d2 + 1);
    		n1 = AddInte(i1, i2);
    		n2 = AddFrac(f1, f2);
    		int ml = MAX(f1.size(), f2.size());
    		int ln2 = n2.size();
    		if ( ln2 > ml ){//小数部分存在进位
    			//将小数进位与整数和进行两个整数相加操作
    			n1 = AddInte(n1, n2.substr(0, ln2 - ml));
    			n2 = n2.substr(ln2 - ml);
    		}
    		res = n1 + '.' + n2;
    	}
    	else if (d1 > 0 && d2 < 0){//第一个是小数,第二个是整数
    		i1 = s1.substr(0, d1);
    		f1 = s1.substr(d1 + 1);
    		i2 = s2;
    		n1 = AddInte(i1, i2);
    		n2 = f1;
    		res = n1 + '.' + n2;
    	}
    	else if (d1 < 0 && d2 > 0){//第一个是整数,第二个是小数
    		i1 = s1;
    		i2 = s2.substr(0, d2);
    		f2 = s2.substr(d2 + 1);
    		n1 = AddInte(i1, i2);
    		n2 = f2;
    		res = n1 + '.' + n2;
    	}
    	else{//两个都是整数
    		i1 = s1;
    		i2 = s2;
    		n1 = AddInte(i1, i2);
    		res = n1;
    	}
    
    	return res;	
    }
    
    int main(){
    	string s1, s2;
    	while (cin >> s1 >> s2){
    		string res;
    		res = Add(s1, s2);
    		cout << res << endl;
    	}
    	return 0;
    }
    
  • 相关阅读:
    Node Sass version 5.0.0 is incompatible with^4.0.0
    Vue v-html 的使用
    SQL 判断时间是否为空
    Element UI 表单验证
    Mybatis-Plus根据条件更新
    语法检查工具 http://jshint.com/
    安装node_modules文件遇到的问题:更改代理
    知识点3: 学习中遇到的问题
    Vue: 用 key 管理可复用的元素
    Vue遇到的问题
  • 原文地址:https://www.cnblogs.com/xuyy-isee/p/11325784.html
Copyright © 2011-2022 走看看