2017華為暑期實習生招聘真題(3月24日)
阿新 • • 發佈:2019-01-10
昨天做了一下華為的機考題,難度比之前的有所增加,因為涉及的知識不再是眾所周知的東西了。
首先第一題就開始坑(對沒看過機考經驗的人來說)
第一題的題目要求是輸入兩個整數a,b(0 < a < b <= 70000),求反轉後的數字的和。
例如:
輸入 123,456
輸出 321 + 654 = 975
輸入 100,200
輸出 3
這道題首先需要處理的就是將int數字反轉的問題。這一步可以通過mod 10運算和整除10運算來實現。
關鍵是輸入格式中,兩個數字之間是以逗號分割的,所以讀入的時候可能需要藉助字串或者流操作,我就是因為沒把這個逗號放在心上導致各種出錯。
實現如下:
實際上sign這個變數(正負號)在這道題中不需要,因為根本不需要考慮小於1的情況。#include <iostream> #include <malloc.h> #include <memory.h> #include <algorithm> #include <sstream> #include <cmath> #include <string.h> #include <stdlib.h> #include <cstdlib> using namespace std; int Reverse(int x) { stringstream ss; string num; ss << x; ss >> num; int sign = x/abs(x); int rev = 0; for(int i = 0; i < num.length(); i++){ rev += (num[i] - '0')*pow(10,i); } /* 當需要反轉的數字大於2位時,反轉後的數字就會比實際數字少1 比如123 ——> 320 求解答原因 */ if(rev > 99) rev = rev+1; return rev*sign; } int reverseAdd(int a, int b) { if(a < 1 || a > 70000 || b < 1 || b > 70000) return -1; else{ return Reverse(a) + Reverse(b); } } int main() { string member; int a, b; char comma; stringstream ss; while(getline(cin, member)){ ss << member; ss >> a >> comma >> b; //cout << Reverse(a) << " " << Reverse(b) << " "; cout << reverseAdd(a, b) << endl; } }
也有使用while來解的方法,但是這樣寫比較方便,就沒管了。
比較好奇的是當數字位數大於2時,這種方法反轉後的數字會比實際答案要少1,尚不清楚時什麼原因,請各位看官賜教。