华为武长区笔试2017

题目1描述

请您写一个reverseAdd函数,该函数根据输入的两个正整数a和b,然后分别将它们的数字按照高位在右边的方式反转后求和。
例如,reverseAdd(123,456)==321+654 ==975

输入描述

函数原型:int reverseAdd(int a,int b);
输入:
输入的a,b参数均为有效取值范围[1,70000]区间上的正整数。
100和200反转后的值为1和2(前导0被忽略)

输入例子

123,456 

结果: 975

题意解析

此题的关键之处,在于对输入的数进行反转输出。
假如输入一个 123,可看出123=100+20+3,我们要求得到
321=300+20+1;
首先把3分离出来 result = 123 % 3 ;当分离出3后,应该前进一位,即,12=123/10;然后继续分离。
实际演化过程为:
3->30->32->320->321.分离后发现是个循环累加的过程。

处理的代码如下:

int void reverseint a){
    int result=0;
    while(a){
        result += a%10;
        result *=10;
        a/=10;
    }
    return result/10;
}

注意:result 最后多乘了10,最后得除去。

此题的完整代码(C++):

#include 
using namespace std;

int reverseAdd(int a,int b){
        int result=0;
        int result_A=0;
        int result_B=0;
        if(a<1||a>70000||b<1||b>70000){
            return -1;
        }else{
            while(a){
                result_A+=a%10;
                result_A*=10;
                a/=10;
            }

            while(b){
                result_B+=b%10;
                result_B*=10;
                b/=10;
            }
            return (result_A+result_B)/10;
        }
    }

int main() {

    int a,b;
    char c;
    while(cin>>a>>c>>b){
        cout<

注:输入123,456 中间有个逗号,是个坑,我是通过定义一个字符来处理,若有你更好方法,欢迎交流 :-D


题目2描述

骰子是一个立方体,每个面一个数字,初始为左1,右2,前3(观察者方向),后4,上5,下6,用123456表示这个状态,放置到平面上,可以向左翻转(用L表示向左翻转1次),可以向右翻转(用R表示向右翻转1次),可以向前翻转(用F表示向前翻转1次),可以向后翻转(用B表示向后翻转1次),可以逆时针旋转(用A表示逆时针旋转90度),可以顺时针旋转(用C表示顺时针旋转90度),现从初始状态开始,根据输入的动作序列,计算得到最终的状态。

输入描述

初始状态为: 123456
输入只包含LRFBAC的字母序列,最大长度为50,可重复

输入例子

RA

结果: 436512

题意解析

此题的关键之处,是对不同的翻转或旋转,判断数组中元素位置的互调。

注意:左翻或右翻,前后位置不变,前翻或后翻,左右位置不变,旋转上下不变。

此题的完整代码(C++):

#include<iostream>

using namespace std;

int main()
{
    string fz;
    int arr[6]={1,2,3,4,5,6};
    int i,j;
    int temp1,temp2;
    cin>>fz;
    for(i=0;i<fz.size();i++){
        if(fz[i]=='R'){
            temp1=arr[5];
            arr[5]=arr[1];
            arr[1]=temp1;

            temp2=arr[4];
            arr[4]=arr[0];
            arr[0]=temp2;

        }
        if(fz[i]=='L'){
            temp1=arr[5];
            arr[5]=arr[0];
            arr[0]=temp1;

            temp2=arr[4];
            arr[4]=arr[1];
            arr[1]=temp2;


        }
        if(fz[i]=='F'){
            temp1=arr[5];
            arr[5]=arr[3];
            arr[3]=temp1;

            temp2=arr[4];
            arr[4]=arr[2];
            arr[2]=temp2;

        }
        if(fz[i]=='B'){
            temp1=arr[5];
            arr[5]=arr[2];
            arr[2]=temp1;

            temp2=arr[4];
            arr[4]=arr[3];
            arr[3]=temp2;

        }
        if(fz[i]=='A'){
            temp1=arr[3];
            arr[3]=arr[0];
            arr[0]=temp1;

            temp2=arr[2];
            arr[2]=arr[1];
            arr[1]=temp2;

        }
        if(fz[i]=='C'){
            temp1=arr[2];
            arr[2]=arr[0];
            arr[0]=temp1;

            temp2=arr[3];
            arr[3]=arr[1];
            arr[1]=temp2;
        }
    }
    for(j=0;j<6;j++){
        cout<<arr[j];
    }

}

注:可用switch进行控制。关键在于使用什么样的数据结构,这里采用数组。


题目3描述

小K是X区域的销售经理,他平时常驻“5”城市,并且经常要到“1”,“2”,“3”,“4”,“6”城市出差。当机场出现大雾情况时,会导致对应城市的所有航班的起飞及降落均停止(即不能从该城市出发,其他城市也不能到达该城市)。小K希望知道如果他需要到X城市出差时,如果遇到Y城市出现大雾,他最短的飞行时间及飞行路径。
注意:当两个城市间不可达时,消耗时间默认取1000.各城市间的飞行时间如下表所示,加粗列代表始发城市,加粗行代表终点城市,矩阵中的值代表从始发城市飞行到终点城市所耗时间(单位小时),M代表不可达(注意飞行线路是单向的,即A->B 不等于 B->A)
例如:
1)从1号城市飞行到4号城市花费5h,从4号城市飞到1号城市花费2h
2) 从5号城市飞行到3号城市不可达,从3号城市飞行到5号城市花费7h.

1 2 3 4 5 6
1 0h 2h 10h 5h 3h M
2 M 0h 12h M M 10h
3 M M 0h M 7h M
4 2h M M 0h 2h M
5 4h M M 1h 0h M
6 3h M 1h M 2h 0h

输入描述

输入出差城市X(X可为1,2,3,4,5,6)
输入大雾城市Y(Y可为0,1,2,3,4,5,6,为0代表没有城市出现大雾)

输入例子

2
4

输出例子

6
{5,1,2}

题意解析

此题的关键之处,占个位,后面补充。

注意:。

此题的完整代码(C++):


如有不妥当之处,请指出,谢谢:-D

你可能感兴趣的:(编程之美)