目录
- 🍋题目描述
- 🍋整体思路
- 🍋代码
- 🍋其他真题
🍋题目描述
观察如下的算式:
9213 x 85674 = 789314562
左边的乘数和被乘数正好用到了1~9的所有数字,每个1次。
而乘积恰好也是用到了1~9的所有数字,并且每个1次。
请你借助计算机的强大计算能力,找出满足如上要求的9数算式一共有多少个?
注意:
总数目包含题目给出的那个示例。
乘数和被乘数交换后作为同一方案来看待。
🍋整体思路
读完题目,很明显就知道是要用全排列。
全排序的模板如下:
private static void f(int k) {
if(k==9) {
/* for(int i=1;i<=8;i++) {
int x1=a2(0,i);
int x2=a2(i,9);
int x=x1*x2;
if(check(x)) {
ans++;
}
}*/
}
for(int i=k;i<9;i++) {
int t=a[k];
a[k]=a[i];
a[i]=t;
f(k+1);
t=a[k];
a[k]=a[i];
a[i]=t;
}
}
全排之后,分割成两个乘数,之后得乘积,进行检查。
需要注意的坑是“乘数和被乘数交换后作为同一方案来看待。”。所以全排列是会出现重复的,所以我们是要除2的。
另一个注意点是乘积是9位数,但是包含0的话,也需要排除这种情况。
另外,我们要学会自己debug。
- 答案:1625
🍋代码
import java.util.HashSet;
import java.util.Set;
public class Main {
static int[] a= {1,2,3,4,5,6,7,8,9};//初始化数组
static int ans;//答案
public static void main(String[] args) {
f(0);//调用函数
System.out.println(ans/2);//全排列有重复,要除2再输出
}
private static void f(int k) {
if(k==9) {//满足条件
for(int i=1;i<=8;i++) {//把数组分成2个数,进行相乘得乘积,来检查
int x1=a2(0,i);//一个乘数
int x2=a2(i,9);//另一个乘数
int x=x1*x2;//乘积
if(check(x)) {//检查乘积
ans++;//符合条件,ans++
}
}
}
for(int i=k;i<9;i++) {//模板得主要部分
int t=a[k];
a[k]=a[i];
a[i]=t;
f(k+1);
t=a[k];
a[k]=a[i];
a[i]=t;
}
}
private static boolean check(int x) {
String s=x+"";//把乘积转化为字符串
if(s.length()!=9||s.indexOf('0')>-1) return false;//如果长度不是9,或者,找到0字符,那么就不符合条件
Set <Character> set=new HashSet<Character>();//声明
for(int i=0;i<s.length();i++) {//把字符串的字符记录
set.add(s.charAt(i));
}
return set.size()==9;//返回
}
private static int a2(int i,int j) {//把数组的数字转化为单个大数。包含i,不包含j
int ans=0;
int p=1;
for(int k=j-1;k>=i;k--) {
ans+=a[k]*p;
p*=10;
}
return ans;
}
}