题目引入
标题
构造表达式
类别
综合
时间限制
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的表达式数量。
代码实现
#include<stdio.h>
#include<math.h>
int main()
{
int function(int n, int a[10]);
int i, n, t, count=0, a[10]={0};
/*把这个题目想象成在数字前面插入"+"、"-"或者不插入符号,那么定义一个数组,
对应元素的值即为符号对应的数字,0对应空白,1对应正号,2对应负号*/
scanf ("%d", &n);
a[1]=1;
//while的功能是遍历所有情况
while (1)
{
/* 从这里开始是遍历的方法,从 a[2]对应的值开始一直加一,
逢三进一,实现遍历的目的 */
a[2]++; //这里把 a[2]作为第一位是为了计算方便
if (a[2]==3)
{
for (i=3; i<=n; i++)
if (a[i]!=2) //无需进位则直接加一,并跳出循环
{
a[i]++;
break;
}
else
{
a[i]=0; //需要进位则当前位归零
}
if (i==n+1)
break;
a[2]=0;
}
// for(i=2;i<=n;i++)
// if (a[i]!=2)
// {
// a[i]++;
// break;
// }
// else
// {
// a[i]=0;
// }
// if (i==n+1) break;
t=function(n, a);
if (t==0)
count++;
}
printf ("%d", count);
return 0;
}
int function(int n, int a[10])
{
int i, num=0, sum=0, count=0;
for (i=n; i>=1; i--)
{
if (a[i]==0) //如果无符号
{
num+=i*pow(10, count);
count++;
}
else if (a[i]==1) //如果为正号
{
num+=i*pow(10, count);
sum+=num;
count=0;
num=0;
}
else if (a[i]==2) //如果为负号
{
num+=i*pow(10, count);
sum-=num;
count=0;
num=0;
}
}
return sum;
}
利用三进制对每种可能的情况进行模拟
好思想需要收入