[蓝桥杯2017初赛]9数算式
题目描述
观察如下的算式:9213 x 85674 = 789314562
左边的乘数和被乘数正好用到了1~9的所有数字,每个1次。
而乘积恰好也是用到了1~9的所有数字,并且每个1次。
请你借助计算机的强大计算能力,找出满足如上要求的9数算式一共有多少个?
注意:
- 总数目包含题目给出的那个示例。
- 乘数和被乘数交换后作为同一方案来看待。
输出
输出一个整数表示答案
package pro;
import java.util.Set;
import java.util.TreeSet;
public class Main {
static int arr[] = {1,2,3,4,5,6,7,8,9};
static int vis[];
static int cnt = 0;
static Set<Integer> set = new TreeSet<Integer>();
public static void main(String[] args) {
for(int i = 1; i <= 8; i++) {
vis = new int[10];
int res[] = new int[i];
dfs(0,i,res);
}
System.out.println(cnt/2);
}
static void dfs(int i,int n,int[] res) {
if(i==n) {
int num[] = new int[10];
int vis[] = new int[10];
int s = 0,len = res.length-1;
for(int j = 0; j < res.length; j++) {
s += res[j]*Math.pow(10, len--);
}
for(int j = 0; j < res.length; j++) {
num[res[j]]++;
}
int ans[] = new int[9-n];
dfs2(s,0,9-n,num,vis,ans);
}else {
for(int j = 0; j < 9; j++) {
if(vis[j]==0) {
vis[j] = 1;
res[i] = arr[j];
dfs(i+1,n,res);
vis[j] = 0;
}
}
}
}
static void dfs2(int s,int i,int n,int num[],int[] vis,int[] ans) {
if(i==n) {
int sum = 0,len = ans.length-1;
for(int j = 0; j < ans.length; j++) {
sum += ans[j]*Math.pow(10, len--);
}
if(test(s,sum)) {
cnt++;
//System.out.println(s+" "+sum+" "+s*sum);
}
}else {
for(int j = 1; j <= 9; j++) {
if(vis[j]==0&&num[j]==0) {
vis[j] = 1;
num[j] = 1;
ans[i] = j;
dfs2(s,i+1,n,num,vis,ans);
vis[j] = 0;
num[j] = 0;
}
}
}
}
static boolean test(int a,int b) {
int arr[] = new int[10];
int num = a*b;
if(a*b<123456789)
return false;
String s = String.valueOf(num);
if(s.length()<9||s.length()>9)
return false;
for(int i = 0; i < s.length(); i++) {
if(s.charAt(i)-'0'<1)
return false;
arr[s.charAt(i)-'0']++;
if(arr[s.charAt(i)-'0']!=1)
return false;
}
return true;
}
}
解析:先dfs乘数然后dfs出符合要求的被乘数,最后test判断