第七届蓝桥杯个人赛省赛(软件类)C++B组试题第三题

一【题目描述】


凑算式

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

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

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

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

二【解题思路】

     这是一道程序填空题,首先我们看题目,给出了几个式子相加,要求我们找到有多少种解法等于10。那首先想到的就是枚举的方法,自习看了一下就是1~9数字全排列,然后作为等式相加等于10的排列有几种。所以这里我们就直接用生成全排列的函数next_permutation(),当然也可以用一个简单的函数生成全排列,提供一个if语句和递归就可以实现。然后进行判断即可,所以来码代码吧。

三【解题步骤】

#include<iostream>
#include<algorithm>
using namespace std;
int a[]={1,2,3,4,5,6,7,8,9};//1~9个数字
int ans;
bool check()//判断是否符合式子
{
	int x = a[3]*100+a[4]*10+a[5];
	int y = a[6]*100+a[7]*10+a[8];
	if(a[0]+(a[1]*y+a[2]*x)/(a[2]*y)==10&&(a[1]*y+a[2]*x)%(a[2]*y)==0)
	return true;
	return false;
}
void f(int k)//这里用函数生成全排列
{
	if(k==9){//这里就生成了一种全排列
		if(check()) ans++;//符合++
	}
	for(int i=k;i<9;i++)//从第k个数字开始生成数字
	{
		{int t = a[i]; a[i]=a[k];a[k]=t;}//交换位置,生成第k个
		f(k+1);//继续下一个
		{int t = a[i]; a[i]=a[k];a[k]=t;}//因为上面交换打乱了顺序,所以要回溯,好继续生成
	}
}
int main()
{
	//f(0);//这里用函数生成全排列,下面用STL函数生成全排列
	do{
		if(check()) ans++;
	}while(next_permutation(a,a+9));//生成全排列
	cout<<ans<<endl;//输出结果
	return 0;
}

答案是:29

四【总结】

     合理的运用STL里面的函数很多时候事半功倍,但是我们还是要理解其中的一些原理。如有更好的,欢迎交流哦,谢谢。

发布了123 篇原创文章 · 获赞 234 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_43919400/article/details/105385461