xdoj-172题 构造表达式

起因

我正被maria机器人框架折磨的焦头烂额呢,我室友@grandsleeper给我发道题让我做在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
你说我一大一小萌新招谁惹谁了,还得陪会cpp的大佬做xdoj。QAQ

思路

这道题如果用for嵌套的话需要根据n的不同改变for的层数执行起来比较麻烦。
我和室友在对视良久之后提出的两种不同的方案,他要用dfs递归(果然是大佬,我根本没听懂QAQ)。我则想到如果是用户指定运算符的话则会简单很多,于是我就提出了用三进制数来模拟用户输入的想法。这样在子函数中就只需要判断指定的操作是否满足条件。

题目

标题
构造表达式

类别
综合

时间限制
1S

内存限制
100Kb

问题描述
给定一个表示序列长度的整数n(3<=n<=9)。在序列1 2 3…n中插入‘+’,‘-’,‘ ’构造表达式,插入‘ ’表示前后两个数字构成一个整数,例如1 2 -3 -4 -5=0。
输出构造的所有表达式中,结果为0的表达式的数量,例如n=3时,只有表达式1+2-3=0,输出结果为1。

输入说明
输入数据为一个整数n(n<10),表示序列长度,同时表示输入序列为“1 2 3…n”。

输出说明
对于每一组数据,输出一个整数,表示构造的表达式中结果为0的表达式数量。

输入样例
3

输出样例
1

代码

#pragma warning(disable:4996)//vs使用scanf函数会报4996错误,此代码会屏蔽此错误
#include<stdio.h>
#include<stdlib.h>
int main()
{
	int check(int b, int c);
	int n, temp, tmp = 0, max = 1,a, out = 0, z[8], aa;//后期改的次数太多变量就没注意命名,z[8]是因为若n<10则三进制数最多为8位
	scanf("%d", &n);
	for (temp = 0; temp < n-1; temp++)
	{
		max *= 3;
	}
	for (temp = 0; temp < max; temp++)//这里开始是生成三进制数传递到子函数中
	{
		a = temp;
		tmp = 0;
		for (aa = 0; aa < 8; aa++)
		{
			z[aa] = a % 3;
			a /= 3;
		}
		for (aa = 7; aa > -1; aa--)
		{
			tmp *= 10;
			tmp += z[aa];
		}
		out += check(n, tmp);//将产生的三进制数传递到子函数中,满足返回1,不满足返回0
	}
	printf("%d", out);
}
int check(int b, int c)
{
	int temp=0, tmp, tem, num1, check, num2;//一样是改的次数太多了,命名没有注意
	tem = temp + 1;
	num2 = tem;
	tmp = c % 10;
	c /= 10;
	while(tmp==0&&temp!=b-1)//看后方是否有空格若有则合并为一个新数直到没有空格或没有数为止
	{
		tem = num2 * 10 + (temp + 2);
		num2 = tem;
		temp++;
		tmp = c % 10;
		c /= 10;
	}
	check = tmp;//记录下运算符
	num1 = tem;
	while(temp!=b-1)
	{
		temp++;
		tmp = c % 10;
		c /= 10;
		tem = temp + 1;
		num2 = tem;
		while (tmp == 0 && temp != b-1)//和上面一样找出运算符后面的数
		{
			tem = num2 * 10 + (temp + 2);
			num2 = tem;
			temp++;
			tmp = c % 10;
			c /= 10;
		}
		if (check == 1)//num1为运算符之前的数,tem为运算符之后的数,check为运算符
		{
			num1 += tem;
		}
		else
		{
			num1 -= tem;
		}
		check = tmp;//记录新的运算符
	}//循环找出新的运算符对应的新数

		if (num1 == 0)
		{
			return 1;
		}
		else
		{
			return 0;
		}
}

我室友的dfs递归版本

链接放这了,去膜拜大佬吧QAQ
xdoj五星题172 构造表达式 ——grandsleeper

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值