蓝桥杯2016年(第7届)省赛b组c/c++ 凑算式


     B      DEF
A + --- + ------- = 10
     C      GHI
     
(如果显示有问题,可以参见【图1.jpg】)
     
     
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。

比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。

这个算式一共有多少种解法?

注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。

分析:这个题目是典型的全排列问题,利用全排列的基本模板就可以了。有一个坑,就是需要对两个分数通分,分别判断通分后的分数是否为整数,分数加上A是否为10,这里给出两个解答方案。

答案:29

第一种,自己手写一个全排列的解题方法:

#include <iostream>
using namespace std;
int c=0,t;
int a[9]={1,2,3,4,5,6,7,8,9};
bool isRight()
{
	int x=a[3]*100+a[4]*10+a[5];
	int y=a[6]*100+a[7]*10+a[8];
	if((a[1]*y+a[2]*x)%(a[2]*y)==0&&a[0]+(a[1]*y+a[2]*x)/(a[2]*y)==10)
		return true;
	return false;
}
void f(int k)
{
	if(k==9)
	{
		if(isRight())
			c++;
	}
	for(int i=k;i<9;i++)
	{
		t=a[i]; a[i]=a[k]; a[k]=t;
		f(k+1);
		t=a[i]; a[i]=a[k]; a[k]=t;
	}	
} 
int main()
{
	f(0);
	cout<<c<<endl;
	return 0;
} 

第二种,直接使用next_permutation进行求解

#include <iostream>
#include <algorithm>  
using namespace std;
int c=0;
int a[9]={1,2,3,4,5,6,7,8,9};
bool isRight()
{
	int x=a[3]*100+a[4]*10+a[5];
	int y=a[6]*100+a[7]*10+a[8];
	if((a[1]*y+a[2]*x)%(a[2]*y)==0&&a[0]+(a[1]*y+a[2]*x)/(a[2]*y)==10)
		return true;
	return false;
}
int main()
{
	while(next_permutation(a,a+9))
	{
		if(isRight())
			c++;
	}
	cout<<c<<endl;
	return 0;
} 
发布了80 篇原创文章 · 获赞 3 · 访问量 922

猜你喜欢

转载自blog.csdn.net/qq_40570410/article/details/105054567