其他分享
首页 > 其他分享> > xdoj-构造表达式(平民打法,身为弱鸡看不懂高端操作)

xdoj-构造表达式(平民打法,身为弱鸡看不懂高端操作)

作者:互联网

标题    
构造表达式

类别    
综合

时间限制    
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

一开始看到这题完全无从下手,只能在CSDN上搜一波,确实看到了很多大佬的高端解法,学到了很多好的思路和想法。

针对这道题,个人认为三进制数的解法比较好,之前也有大佬打过这个思路,但身为菜鸟看了半天才弄明白,所以自己研究了一下最平民的打法。话不多说,剩下的看代码

#include<stdio.h>
//核心思想:手动生成三进制数,0代表空格,1代表'+',2代表'-',穷举所有情况,统计解的个数 
int main(void)
{
	int n;
	scanf("%d",&n);//输入n 
	
	int a[n-1],b[20];//b数组为1到n这n个数,a数组用来存储生成的三进制数。 
	int i;
	
	for(i=0;i<n-1;i++){
		a[i]=0;
	} //给a数组赋初值 
	
	int max=1;
	for(i=0;i<n-1;i++){
		max=max*3;
	}//为生成三进制数做准备 
	
	int j,t,k,h,ans=0,temlong1,temlong2;
	for(i=0;i<max;i++){
		t=i;
		for(j=0;j<n-1;j++){
			a[j]=t%3;
			t=t/3;
		}//a数组中存入生成的三进制数 
		
		for(j=0;j<19;j++){
			b[j]=j+1;
		}//给b数组赋初值 
		
		temlong1=n;
		temlong2=n-1;
		for(k=0;k<temlong2;k++){
			if(a[k]==0){
				b[k]=b[k]*10+b[k+1];
				for(h=k+1;h<temlong1-1;h++){
				b[h]=b[h+1];
				}
				temlong1--;
				for(h=k;h<temlong2-1;h++){
					a[h]=a[h+1];
				}
				temlong2--;
				k--;
			}
		}//先处理所有空格,让a,b两个数组更“好起来”:a数组中删除所有0的同时b数组中做相应合并操作 
 
		for(k=0;k<temlong2;k++){
			a[0]=a[k];
			b[1]=b[k+1];
			if(a[0]==1){
				b[0]=b[0]+b[1];
			}else{
				b[0]=b[0]-b[1];
			}
		}//这一步就相对简单了,该加的时候加,该减的时候减 
		if(b[0]==0)ans++;//如果能成功,结果+1; 
	} 
	printf("%d",ans);//最后输出(Finished!!!) 
	return 0;
}

标签:输出,进制,int,打法,xdoj,弱鸡,输入,构造,表达式
来源: https://blog.csdn.net/qq_63318321/article/details/122265248