观察如下的算式:
9213 x 85674 = 789314562
左边的乘数和被乘数正好用到了1~9的所有数字,每个1次。
而乘积恰好也是用到了1~9的所有数字,并且每个1次。
请你借助计算机的强大计算能力,找出满足如上要求的9数算式一共有多少个?
注意:
1. 总数目包含题目给出的那个示例。
9213 x 85674 = 789314562
左边的乘数和被乘数正好用到了1~9的所有数字,每个1次。
而乘积恰好也是用到了1~9的所有数字,并且每个1次。
请你借助计算机的强大计算能力,找出满足如上要求的9数算式一共有多少个?
注意:
1. 总数目包含题目给出的那个示例。
2. 乘数和被乘数交换后作为同一方案来看待
思路:由于数据量庞大,所以采用分层计算的方法,在约束最后判断i,j,i*j之前尽量将不符合条件的数去掉。
答案:1625
import java.util.HashSet;
import java.util.Set;
public class 九数算式 {
/**
* @param args
*/
static int sum=0;
public static void main(String[] args) {
for (int i = 1234; i <= 9876; i++) {
if(fs(i)){
for (int j =12345 ; j <= 98765; j++) {
if(fs(j) && fs(i*j)){
if(isNum(i,j,i*j)){// 满足题干条件
System.out.println(i+"*"+j+"="+(i*j));
}
}
}
}
}
for (int i = 123; i <= 987; i++) {
if(fs(i)){
for (int j =123456 ; j <= 987656; j++) {
if(fs(j) && fs(i*j)){
if(isNum(i,j,i*j)){// 满足题干条件
System.out.println(i+"*"+j+"="+(i*j));
}
}
}
}
}
for (int i = 12; i <= 98; i++) {
if(fs(i)){
for (int j =1234567 ; j <= 9876567; j++) {
if(fs(j) && fs(i*j)){
if(isNum(i,j,i*j)){// 满足题干条件
System.out.println(i+"*"+j+"="+(i*j));
}
}
}
}
}
for (int i = 2; i <= 9; i++) {
for (int j =12345678 ; j <= 98765432; j++) {
if(fs(j) && fs(i*j)){
if(isNum(i,j,i*j)){// 满足题干条件
System.out.println(i+"*"+j+"="+(i*j));
}
}
}
}
System.out.println(sum);
}
/**
* 检验是否包含0
* @param i
* @return
*/
private static boolean fs(int i) {
while (i!=0) {
if(i%10==0){
return false;
}
i/=10;
}
return true;
}
/**
* 检验是否重复
* @param a
* @param b
* @param ss a,b的乘积
* @return
*/
private static boolean isNum(int a, int b, int ss) {
Set<Integer> set1=new HashSet<Integer>();
Set<Integer> set2=new HashSet<Integer>();
while (ss!=0) {
set1.add(ss%10);
ss/=10;
}
if(set1.size()!=9){
return false;
}
while (a!=0) {
set2.add(a%10);
a/=10;
}
while (b!=0) {
set2.add(b%10);
b/=10;
}
if(set2.size()!=9){
return false;
}
if(set1.size()==set2.size()){
sum++;
return true;
}
return false;
}
}