美文网首页
华为2016机试题目

华为2016机试题目

作者: 落辰风雷 | 来源:发表于2017-08-29 17:20 被阅读0次

    实现语言:C++ 题目简单,没有涉及太多的算法,就是一些输入输出的格式需要注意

    题目一

    描述
    根据指定的分隔符分隔字符串,并输出指定的段。如果指定的段超过分隔的段数,输出:NULL
    举例:
    AAA?BBB?CCC??2
    字符串为:AAA?BBB?CCC?
    分隔符为:?
    指定的段为:2
    字符串分割为:AAA BBB CCC共三段,第2段字符串为:BBB
    输入输出格式要求
    输入分隔字符串长度小于128个字符,指定的段是一个正整数。

    样例
    输入:AAA?BBB?CCC??2
    输出:BBB

    实现代码如下:

    #include <iostream>
    #include <string.h>
    #include <vector>
    #include <typeinfo>
    #include <cctype>
    using namespace std;
    
    int getNum(string inpus)
    {
        int objNum = 0,t = 1;
        for (long i = inpus.length() - 1; i >= 0 ; -- i) {
            if (isdigit(inpus[i]) && inpus[i] != '?') {
                objNum += (inpus[i]- '0') * t;
                t *= 10;
            } else {
                break;
            }
        }
        return objNum;
    }
    
    int main(int argc, const char * argv[]) {
        string inpus;
        cin >> inpus;
        vector<string> objStringInfo;
        string a = "";
        for (int i = 0; i < inpus.length(); ++i) {
            if (inpus[i] == '?' || i == inpus.length()) {
                objStringInfo.push_back(a);
                a = "";
            }
            else {
                a += inpus[i];
            }
        }
        cout << objStringInfo[getNum(inpus) - 1] << endl;
        return 0;
    }
    

    运行结果:

    题目一.png

    题目二

    输入一组大于0小于1000的整数,且均不相同,逗号隔开,输出其中能被这些整数中其他元素整除的那些元素。
    输入输出格式要求
    输入要求同上述描述,输出要求整数顺序按照输入时的顺序输出。
    样例
    输入:2,4,6,8,10,12,3,9
    输出:4,6,8,10,12,9

    代码如下:

    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    int getStringNum(string inpus)
    {
        int objNum = 0,t = 1;
        for (long i = inpus.length() - 1; i >= 0 ; -- i) {
            if (isdigit(inpus[i]) && inpus[i] != '?') {
                objNum += (inpus[i]- '0') * t;
                t *= 10;
            } else {
                break;
            }
        }
        return objNum;
    }
    
    vector<int> getNum(string inputs)
    {
        vector<string> v;
        vector<int> num;
        string buff = "";
        for (int i = 0;i <= inputs.length(); ++i) {
            if (i == inputs.length() - 1) {
                buff = inputs[inputs.length() - 1];
                v.push_back(buff);
                buff = "";
            }
            if (inputs[i] == ',') {
                v.push_back(buff);
                buff = "";
            } else{
                buff +=  inputs[i];
            }
        }
        for (int i = 0;i < v.size(); ++ i) {
            num.push_back(getStringNum(v[i]));
        }
        return num;
    }
    
    int main(int argc, const char * argv[]) {
        string s;
        cin >> s;
        vector<int> array = getNum(s);
        int k = 0,result[100] = {0};
        for (int i = 0;i < array.size(); ++i) {
            for (int j = 0;j < array.size(); ++j) {
                if (array[i] % array[j] == 0 && array[i] != array[j])
                {
                    result[k] = array[i];
                    k ++;
                    break;
                }
            }
        }
        for (int i = 0;i < k; ++i)
        {
            if (i != k-1)
                cout << result[i] << ",";
            else
                cout << result[i] << endl;
        }
        return 0;
    }
    
    

    题目三

    描述:大数求余
    输入两个超长整型构成的字符串,使用空格隔开,求前者除以后者的余数。
    输入输出格式要求
    输入的每个字符串最大长度为100个字符,输出为余数值,如果结果异常输出NULL
    样例
    输入:123456789 23456789
    输出:6172844

    主要涉及大数问题,A对B取模,即除法运算,可以利用高精度减法解决,前期想的时候细节上可能会有问题,需要注意减法过程中对符号的处理

    代码如下:

    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    string subtraction(string a,string b)//大数减法
    {
        int arr1[100] = {0},arr2[100] = {0},arr3[100] = {0};
        for (long i = a.length() - 1,k = 0;i >= 0; --i) {
            arr1[k++] = a[i] - '0';
        }
        for (long i = b.length() - 1,k = 0;i >= 0; --i) {
            arr2[k++] = b[i] - '0';
        }
        long len = (a.length() > b.length()) ? a.length():b.length();
        int k = 0;
        for (int i = 0;i < len; ++i) {
            arr3[k++] = arr1[i] - arr2[i];
        }
        for (int i = 0;i < k; ++i) {
            if (arr3[k - 1] < 0) {
                arr3[k] = '-';
                arr3[i] = abs(arr3[i]);
            } else {
                arr3[i] = abs(arr3[i]);
            }
        }
        string result = "",buff = "";
        while (arr3[k] == 0) {
            k--;
        }
        for (int i = k; i >= 0; --i) {
            buff = arr3[i] + '0';
            result += buff;
        }
        return result;
    }
    
    string aModeB(string a,string b)//大数取模
    {
        if (a.length() > b.length()) {
            while (a.compare(b) > 0) {
                a = subtraction(a, b);
            }
            return a;
        }
        else if (a.length() == b.length())
        {
            if(a.compare(b) > 0)
            {
                while (a.compare(b) > 0) {
                    a = subtraction(a, b);
                }
                return a;
            }
            else
                return a;
        }
        else
            return a;
        
    }
    int main(int argc, const char * argv[]) {
        string a,b;
        cin >> a;
        cin >> b;
        cout << aModeB(a, b) << endl;
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:华为2016机试题目

          本文链接:https://www.haomeiwen.com/subject/xysodxtx.html