1. 程式人生 > >2017華為暑期實習生招聘真題(3月24日)

2017華為暑期實習生招聘真題(3月24日)

昨天做了一下華為的機考題,難度比之前的有所增加,因為涉及的知識不再是眾所周知的東西了。

首先第一題就開始坑(對沒看過機考經驗的人來說)

第一題的題目要求是輸入兩個整數a,b(0 < a < b <= 70000),求反轉後的數字的和。

例如:

輸入 123,456

輸出 321 + 654 = 975

輸入 100,200

輸出 3

這道題首先需要處理的就是將int數字反轉的問題。這一步可以通過mod 10運算和整除10運算來實現。

關鍵是輸入格式中,兩個數字之間是以逗號分割的,所以讀入的時候可能需要藉助字串或者流操作,我就是因為沒把這個逗號放在心上導致各種出錯。

實現如下:

#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;
    }

}
實際上sign這個變數(正負號)在這道題中不需要,因為根本不需要考慮小於1的情況。

也有使用while來解的方法,但是這樣寫比較方便,就沒管了。

比較好奇的是當數字位數大於2時,這種方法反轉後的數字會比實際答案要少1,尚不清楚時什麼原因,請各位看官賜教。