华为机试题

来源:互联网 发布:淘宝用卷怎么用 编辑:程序博客网 时间:2024/05/17 07:30
明年就要找工作了,在补充自己的同时偶尔会搜一搜大公司的上机试题来做。之前看到一题觉得还不错,与大家分享。有好题目的可以与我交流,加我qq:468008249.注明:csdn。
华为机试题:1 2 3 4 5 6 7 8 9,共9个数字,按照此顺序,在1~9的中间的空白处填入“+”或“-”或“ ”,,例如,在2、3之间填入“-”,4、5之间填入“+”,6、7之间填入“+”,8、9间填入“-”,其他地方默认“ ”,则得到这样一个等式:12-34+56+78-9,得数为:103。
题目要求:用户输入一个数字,程序输出共有多少种符合上述构成要求的等式能够计算出这个数字。例如,输入5,输出“共有21种可能”。
代码:
最笨的方法,不过不难理解。以后如果想到了更好的方法会继续分享。自己还编了一个用python实现的,这里就不贴出来了。
#include<iostream>#include<string>int compute(int *p,char a[17]);int * transfer(char a[17]);using namespace std;int main(){int count=0;int want;cout << "Please enter the result you want to get:" << endl;cin >> want;char a[17] = { '1',' ','2',' ','3',' ','4',' ','5',' ','6',' ','7',' ','8',' ','9' };char b[3] = { '+','-',' ' };for (int i = 0; i < 3; i++)//通过最笨的循环,得到所有可能的情况。{for (int j = 0; j < 3; j++){for (int k = 0; k < 3; k++){for (int o = 0; o < 3; o++){for (int p = 0; p < 3; p++){for (int q = 0; q < 3; q++){for (int r = 0; r < 3; r++){for (int s = 0; s < 3; s++){a[1] = b[i]; a[3] = b[j]; a[5] = b[k]; a[7] = b[o]; 
a[9] = b[p]; a[11] = b[q]; a[13] = b[r]; a[15] = b[s];if (compute(transfer(a), a) == want)count += 1;}}}}}}}}cout << "There are " << count << " ways to get it!";system("pause");return 0;}int * transfer(char a[17])//将char型的数组进行转换,以“+”和“-”为分割,将“ ”去掉,得到一个新的int型数组.{int *p=new int[9];int count = 0;int cc = 0;int begin;int temp = 0;for (int i = 0; i < 17; i += 2){temp = 0;begin = i;i += 2;while (a[i - 1] == ' '){i += 2;}i = i - 2;for (int j = begin; j <= i; j+=2){temp =10 *temp+(a[j]-'0');}*(p+count) = temp;count++;}for (int j = count; j < 9; j++)*(p+j) = 0;return p;}int compute(int * p,char a[17])//对之前得到的int数组进行求值。隐含的规律:得到的int型数字的长度一定比初始的char型数组中的“+”和“-”的数量和多1。{int n_symbol = 0;int n_num = 1;int result = 0;result += *p;for (int i = 1; i < 16; i += 2){switch (a[i]){case'+': {result += *(p + n_num);n_num += 1;break; }case'-': {result -= *(p + n_num);n_num += 1;break; }default:break;}}return result;}

1 0
原创粉丝点击