明年就要找工作了,在补充自己的同时偶尔会搜一搜大公司的上机试题来做。之前看到一题觉得还不错,与大家分享。有好题目的可以与我交流,加我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;
}