標(biāo)題:9數(shù)算式
觀察如下的算式:
9213 x 85674 = 789314562
左邊的乘數(shù)和被乘數(shù)正好用到了1~9的所有數(shù)字芍秆,每個(gè)1次。
而乘積恰好也是用到了1~9的所有數(shù)字恨胚,并且每個(gè)1次。
請(qǐng)你借助計(jì)算機(jī)的強(qiáng)大計(jì)算能力,找出滿足如上要求的9數(shù)算式一共有多少個(gè)秧了?
注意:
- 總數(shù)目包含題目給出的那個(gè)示例。
- 乘數(shù)和被乘數(shù)交換后作為同一方案來(lái)看待序无。
思路
- 先找出符合條件的數(shù)字串验毡。
- 對(duì)數(shù)字串進(jìn)行拆解。
- 對(duì)拆解的數(shù)字串驗(yàn)證拆解的兩個(gè)數(shù)相乘的結(jié)果是否符合題目要求帝嗡。
- 因?yàn)槌藬?shù)和被乘數(shù)交換作為同一方案看待晶通,所以最后的結(jié)果需要除以2。
代碼
public class Main {
static int res = 0; //結(jié)果數(shù)
static String num = ""; // 1~9數(shù)字串
static int flag[] = new int [10]; //1~9的標(biāo)識(shí)符
//主方法
public static void main (String args[]) {
dfs(0, num);
System.out.println(res / 2);
}
//尋找所有1~9的數(shù)字
static void dfs(int n, String num) {
if (n == 9) {
split_num(num);
return;
}
for (int i=1; i<10; i++) {
if (flag[i] == 0) {
flag[i] = 1;
dfs(n+1, num + i);
flag[i] = 0;
}
}
}
static void split_num (String num) {
for (int i=1; i<9; i++) {
String left = num.substring(0, i);
String right = num.substring(i, 9);
int result = Integer.parseInt(left) * Integer.parseInt(right);
if (check(result)) {
res ++;
}
}
}
// 檢查result是否符合要求
static boolean check(int num) {
String result = String.valueOf(num); // 整形轉(zhuǎn)字符串
int resFlag[] = new int[10];
resFlag[0] = 1; // 排除包含0的情況
if (result.length() != 9) {
return false;
}
for (int i=0; i<9; i++) {
int n = Integer.parseInt(result.substring(i, i+1));
if (resFlag[n] == 0) {
resFlag[n] = 1;
} else {
return false;
}
}
return true;
}
}