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;
}