凑算式
A + --- + ------- = 10
C GHI
(如果显示有问题,可以参见【图1.jpg】)
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
注意:你提交应该是个整数,不要填写任何多余的内容或说明性文字。
答案:29
看到这种题,就直接暴力枚举
之前用的办法是直接九层循环
for(int a=1;a<10;a++)
for(int b=1;b<10;b++)
for(int c=1;c<10;c++)
for(int d=1;d<10;d++)
for(int e=1;e<10;e++)
for(int f=1;f<10;f++)
for(int g=1;g<10;g++)
for(int h=1;h<10;h++)
for(int i=1;i<10;i++)
{
//TODO if( rule(a...i) && Set(a...i) )
}
九层循环,然后最里面有一个rule规则判断,再加一个Set,利用set添加无重复性特性,判断(a...i)是不是长度为9的不重复集
这样也能出答案,不过有点慢。
所以就摸索着写一个全排列的东西,以后判断类似的公式呀什么的,可以减少时间
代码如下:
class Main{
static int count=0;
public static void main(String[] args) {
int []a=new int[]{1,2,3,4,5,6,7,8,9};
f(a,0);
System.out.println(count);
}
private static void f(int[] a, int k) {
if(k==a.length)
{
//TODO 这里产生全排列,只需要在这里做一个判断 if(rule(a)) ....
if((a[3]*100+a[4]*10+a[5])*a[2]==(10*a[2]-a[0]*a[2]-a[1])*(a[6]*100+a[7]*10+a[8]))
count++;
}
for(int i=k;i<a.length;i++)
{
int temp=a[k]; a[k]=a[i]; a[i]=temp;
f(a, k+1);
temp=a[k]; a[k]=a[i]; a[i]=temp;
}
}
}
去掉 f函数 里面的 if判断,整个代码就是一个全排列的模板,以后遇到不同的题,就换下Rule函数,就可以轻松解题,减少计算机运行的时间。