华为机试题

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值