一【题目描述】
凑算式
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里面的函数很多时候事半功倍,但是我们还是要理解其中的一些原理。如有更好的,欢迎交流哦,谢谢。