a的N次方的全部尝试

题目引入
标题
构造表达式

类别
综合

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

利用三进制对每种可能的情况进行模拟
好思想需要收入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值