小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。
有一次,老师出的题目是:36 x 495 = ?
他却给抄成了:396 x 45 = ?
但结果却很戏剧性,他的答案竟然是对的!!
因为 36 * 495 = 396 * 45 = 17820
类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54
假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0)
能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢?
请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。
满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。
答案直接通过浏览器提交。
注意:只提交一个表示最终统计种类数的数字,不要提交解答过程或其它多余的内容。
答案:142
暴力枚举就可以
package holiday;
import java.util.Scanner;
import java.util.Vector;
public class A {
public static void main(String args[])
{
int count=0;
for(int a=1;a<=9;a++)
{
for(int b=1;b<=9;b++)
{
if(a!=b)
for(int c=1;c<=9;c++)
{
if(c!=a&&c!=b)
for(int d=1;d<=9;d++)
{
if(d!=a&&d!=b&&d!=c)
for(int e=1;e<=9;e++)
{
if(e!=a&&e!=b&&e!=c&&e!=d)
if((a*10+b)*(c*100+d*10+e)==(a*100+d*10+b)*(c*10+e))
{
count++;
}
}
}
}
}
}
System.out.println(count);
}
}
当然,递归也是一个不错的选择,如果被选中的不止这abcde五个数,应该用递归来做,但是难度较大。下面是代码,体会一下。
用flag数组来标记,保证每次赋给b数组的值不重复。
package holiday;
import java.util.Scanner;
import java.util.Vector;
public class Test {
public static int a[]={1,2,3,4,5,6,7,8,9};
public static int b[]=new int[5];
public static int count=0;
public static boolean flag[]=new boolean [9];
public static void main(String args[])
{
for(int i=0;i<5;i++)
{
b[i]=0;
}
fun(0);
System.out.println(count);
}
public static boolean checked(int b[])
{
int num1=b[0]*10+b[1];
int num2=b[2]*100+b[3]*10+b[4];
int num3=b[0]*100+b[3]*10+b[1];
int num4=b[2]*10+b[4];
if(num1*num2==num3*num4)
return true;
else
return false;
}
public static void fun(int n)
{
for(int i=0;i<9;i++)
{
if(b[n]==0&&flag[i]==false)
{
b[n]=a[i];
flag[i]=true;
if(n==4)
{
if(checked(b))
{
System.out.println(""+b[0]+b[1]+b[2]+b[3]+b[4]);
count++;
}
}
else
fun(n+1);
b[n]=0;
flag[i]=false;
}
}
}
}
其实一直都不怎么会写递归,这样写是仿照类似的一道蓝桥杯题目:扑克序列(原题及解答:http://blog.csdn.net/wqy20140101/article/details/50809115)。但注意这两道题有一个比较根本的区别,扑克序列要取遍所有的数,所以递归传递的是已知数组下标,for循环的是结果数组下标;而本题是从九个数中选取合适的五个,所以递归传递的是结果数组下标,for循环已知数组,寻找合适的数来匹配。