XDOJ 172.构造表达式——3进制做法

伤心啊

 这题做了好久,该说不愧是五星题,但主要应该是因为我菜~

 

标题    
构造表达式

类别    
综合

时间限制    
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
其他输入输出:7~6        8~10        9~11        其他输入(4,5,6)结果输出都是1

主要思路就是:

三进制数组来遍历,才不是不会写递归思路,

中间是把数储存下来,最后再求sum.

嗯,对,就这样!

#include<stdio.h>

int main()
{
	int z[10]={0};
	int n,sign,flag,key=1,num=0,sum=0;
	scanf("%d",&n);
	while(1)
	{
		key=1;
		sum=0;
		int h[10]={0};
		h[1]=1;
		for(sign=2;sign<=n;sign++)
		{
			if(z[sign]==0)//'+'
			{
				h[++key]=sign;
			}
			if(z[sign]==1)//'-'
			{
				h[++key]=-sign;
			}
			if(z[sign]==2)//' '
			{
				if(h[key]>0) h[key]=h[key]*10+sign;
				else h[key]=h[key]*10-sign;
			}
		}
		for(sign=1;sign<=key;sign++)
		{
			sum+=h[sign];
		}
		if(sum==0)
		{
			num++;
			/*for(sign=1;sign<=key;sign++)
			{
				printf("%d ",h[sign]);
			}
			printf("\n");这是个测试用的
			*/
		}
        //下面就是三进制遍历了
		z[n]++;
		for(flag=n;flag>1;flag--)
		{
			if(z[flag]==3)
			{
				z[flag-1]++;
				z[flag]=0;
			}
		}
		if(z[1]==1) break;
	}
	printf("%d",num);
	return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值