2014|2015 华为机考简单题解体报告

这是2014(2015?)年华为机考简单题简单,倒数第二题就是为了好玩(或者虐CPU)…..

/*
     2015 huawei test.
     Author:hujian
     Time:2016/4/4 nankai
*/

/*
  * 1. 60 points problem 
*/
#include <iostream>
#include <list>
#include <string>

using namespace std;

//#define _A_1_
#ifdef  _A_1_
//a
//input m,n,and m means the num of input string.
//and the n means the output length.
//
int main()
{
    int m, n,nxlength=0;
    string input,output="";
    cin >> m >> n;
    while (m--){
        cin >> input;
        if (input.length() == n){
            cout << input << endl;
        }
        else if (input.length() < n){
            nxlength = n - input.length();
            string zero(nxlength, '0');
            cout << input + zero << endl;
        }
        else{
            int index = input.length() / n;
            int ii = 0;
            while (index--){
                output = input.substr(ii*n, n);
                cout << output << endl;
                ii++;
            }
            if (input.length() % n != 0){
                int till = ii*n;
                output = input.substr(till);
                nxlength = n - output.length();
                string zero(nxlength, '0');
                cout << output + zero << endl;
            }
        }
    }
   exit(EXIT_SUCCESS);
}
#endif  //end of a 1



//#define  _A_2_
#ifdef   _A_2_
   //ok,just trans string to number
   // yi er san si wu liu qi ba jiu
   //  1  2  3  4   5  6  7  8  9
   // yi  er sa si  wu li qi  ba ji    
int main()
{
    string   input;
    while (cin >> input)
    {
        int index = 0;
        for (int i = 0; i < input.length(); i++){
            switch (input[i])
            {
            case 'y':
                putchar('1');
                index += 2;
                break;
            case 'e':
                putchar('2');
                index += 2;
                break;
            case 's':
                if (input[i+1] == 'a'){
                    putchar('3');
                    index += 3;
                }
                else{
                    putchar('4');
                    index += 2;
                }
                break;
            case 'w':
                putchar('5');
                index += 2;
                break;
            case 'l':
                putchar('6');
                index += 2;
                break;
            case 'q':
                putchar('7');
                index += 2;
                break;
            case 'b':
                putchar('8');
                index += 2;
                break;
            case 'j':
                putchar('9');
                index += 2;
                break;
            }
        }
    }
  exit(EXIT_SUCCESS);
}
#endif   //end of a 2


//#define  _A_3_
#ifdef   _A_3_
//just sort   so easy if use the STL's list
//
int main()
{
    list<char> l;
    string  in;
    cin >> in;
    for (int i = 0; i < in.length(); i++){
        l.push_back(in[i]);
    }
    l.unique(); //hehe
    l.sort();   //hehe
    list<char>::iterator lit;
    for (lit = l.begin(); lit != l.end(); lit++){
        cout << *lit;
    }
    putchar('\n');
    exit(EXIT_SUCCESS);
}
#endif  //end of a 3

#define  _A_4_
#ifdef   _A_4_
/*
输入一个正整数X,在下面的等式左边的数字之间添加+号或者-号,使得等式成立。
1 2 3 4 5 6 7 8 9 = X
比如:
12-34+5-67+89 = 5
1+23+4-5+6-7-8-9 = 5
请编写程序,统计满足输入整数的所有整数个数。
输入:       正整数,等式右边的数字
输出:       使该等式成立的个数
样例输入:5
样例输出:21
*/

#include<algorithm>

string solve(int op[])
{
    // 1 3 5 7 9 11 13 15
    string res = "1_2_3_4_5_6_7_8_9";
    switch (op[0]){
    case 0:res[1] = '+'; break;
    case 1:res[1] = '-'; break;
    case 2:res[1] = 'x'; break;
    }
    switch (op[1]){
    case 0:res[3] = '+'; break;
    case 1:res[3] = '-'; break;
    case 2:res[3] = 'x'; break;
    }
    switch (op[2]){
    case 0:res[5] = '+'; break;
    case 1:res[5] = '-'; break;
    case 2:res[5] = 'x'; break;
    }
    switch (op[3]){
    case 0:res[7] = '+'; break;
    case 1:res[7] = '-'; break;
    case 2:res[7] = 'x'; break;
    }
    switch (op[4]){
    case 0:res[9] = '+'; break;
    case 1:res[9] = '-'; break;
    case 2:res[9] = 'x'; break;
    }
    switch (op[5]){
    case 0:res[11] = '+'; break;
    case 1:res[11] = '-'; break;
    case 2:res[11] = 'x'; break;
    }
    switch (op[6]){
    case 0:res[13] = '+'; break;
    case 1:res[13] = '-'; break;
    case 2:res[13] = 'x'; break;
    }
    switch (op[7]){
    case 0:res[15] = '+'; break;
    case 1:res[15] = '-'; break;
    case 2:res[15] = 'x'; break;
    }
    string::iterator sit;
    for (sit = res.begin(); sit != res.end(); sit++){
        if (*sit == 'x'){
            res.erase(sit);
        }
    }
    return res;
}
//get the number and the ops and push stack
#include <stack>
#include<algorithm>
#include <Windows.h>

stack<string> ps(string str)
{
    stack<string> st;
    reverse(str.begin(), str.end());
    while (!st.empty()) st.pop();
    string now = "";
    for (int i = 0; i <= str.length(); i++){
        if (str[i] != ' '){
            if (isdigit(str[i])){
                now += str[i];
            }
            else{
                reverse(now.begin(), now.end());
                if (now!=" ")
                st.push(now);
                now = "";
                now += str[i];
                if (now != " ")
                st.push(now);
                now = "";
            }
        }
    }
    return st;
}

int  calc(stack<string> s)
{
    s.pop();
    if (s.empty()||s.size()<3) return -100000;
    int res= 0;
    //pp1 and pp3 is number,pp2 is op
    string pp1= "",pp2="",pp3="";
    //first tp
    pp1 = s.top();
    s.pop();
    pp2 = s.top();
    s.pop();
    pp3 = s.top();
    s.pop();
    int tmp = 0;
    if (pp2 == "+"){
        tmp = atoi(pp1.c_str()) + atoi(pp3.c_str());
    }
    else{
        tmp = atoi(pp1.c_str()) - atoi(pp3.c_str());
    }
    res += tmp;
    while (!s.empty()){
        pp2 = s.top(); s.pop();
        pp3 = s.top(); s.pop();
        if (pp2 == "+"){
            res+= atoi(pp3.c_str());
        }
        else{
            res-= atoi(pp3.c_str());
        }
    }
    return res;
}

// 0 means + 
// 1 means - 
// 2 means null
int ops[8];

int main()
{
    int result;
    int cnt = 0;
    cin >> result;
    int i1, i2, i3, i4, i5, i6, i7, i8,i;
    for (i1 = 0; i1 < 3;i1++)
        for (i2 = 0; i2< 3; i2++)
            for (i3 = 0; i3 < 3; i3++)
                for (i4 = 0; i4 < 3; i4++)
                    for (i5= 0; i5 < 3; i5++)
                        for (i6 = 0; i6 < 3; i6++)
                            for (i7 = 0; i7 < 3; i7++)
                                for (i8 = 0; i8 < 3; i8++){                                 
                                    ops[0] = i1;
                                    ops[1] = i2;
                                    ops[2] = i3;
                                    ops[3] = i4;
                                    ops[4] = i5;
                                    ops[5] = i6;
                                    ops[6] = i7;
                                    ops[7] = i8;
                                    //todo....
                                    int tmp=0;
                                    tmp= calc(ps(solve(ops)));
                                    if (tmp == result){
                                        cnt++;
                                        cout << solve(ops) << "=" << result << endl;
                                    }
                                }
    cout << "Total:" << cnt << endl;
    exit(EXIT_SUCCESS);
}
#endif  //end of a 4



//#define  _A_5_
#ifdef   _A_5_
/*
输入整数(n是小于9位数的整数),当作字符串处理,
看是否有相同的子串,如1212,相同子串是12,
141516则没有子串(子串长度必须大于等于2)。
若有相同子串则输出1,否则输出0
输入:长度小于9的整数
输出1或者0
*/
int main()
{
    string in,pre,nex;
    int minlen=2, maxlen = 0;
    while (cin >> in){
        maxlen = in.length() / 2;
        bool ok = false;
        for (int len = minlen; len <=maxlen; len++){//ctl the com length
            for (int i = 0; i <=in.length() - len; i++){
                pre = in.substr(i, len);
                for (int k = i + 1; k + len <=in.length(); k++){
                    nex = in.substr(k, len);
                    if (pre == nex){
                        cout << "1" << endl;
                        ok = true;
                        goto out;
                    }
                }
            }
        }
        out:
        if (!ok){
            cout << "0" << endl;
        }
    }
    exit(EXIT_SUCCESS);
}
#endif  //end of a 5
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值