伤心啊
这题做了好久,该说不愧是五星题,但主要应该是因为我菜~
标题
构造表达式
类别
综合
时间限制
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;
}