看代码
package lanqiao;
/*标题:神奇算式
由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。
比如:
210 x 6 = 1260
8 x 473 = 3784
27 x 81 = 2187
都符合要求。
如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。
请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。*/
/*解题思路
这个问题的思路也是枚举法,枚举对象分别为积和那个较小的乘数。
还有两个限制条件:
每个数字的每一位数字不允许重复;
这4个数字出现且仅出现2次。
这些限制条件是使用一个标记数组实现的。*/
public class shenqi{
static int vis[]=new int[10];//判断限制条件
/*
* 函数名check
* 判断是否是这4个数字且仅出现2次。
* 检验乘数
* */
public static boolean check(int x, int y) {
do {
if(vis[x % 10] == 0) {
return false;
}
vis[x % 10]--;
x =x/ 10;
} while(x!=0);
do {
if(vis[y % 10] == 0) {
return false;
}
vis[y % 10]--;
y =y/ 10;
} while(y!= 0);
return true;
}
/* 函数名check4
* 检查每个数字的每一位数字是否重复
* 并且把每位数字作为数组下标存下来下来
* 检验乘积
* */
public static boolean check4(int x) {
do {
if(vis[x % 10] != 0) {
return false;
}
vis[x % 10]++;
x =x/ 10;
} while(x!=0);
return true;
}
public static void main(String[] args) {
int bk[]=new int[10];
// TODO Auto-generated method stub
int cnt=0;
for (int i = 1023; i<=9876; i++) {
//将vis赋值为0
for (int j = 0; j < vis.length; j++) {
vis[j]=0;
}
if (!check4(i)) {
continue;
}
//将vis的值赋给bk
for (int j1 = 0; j1 < vis.length; j1++) {
int t=vis[j1];
bk[j1]=t;
}
for (int j = 1; j<=98; j++) {
for (int j1 = 0; j1 < bk.length; j1++) {
int t=bk[j1];
vis[j1]=t;
}
if (i%j!=0) {
continue;
}
int k=i/j;
if (j>k) {
continue;
}
if (!check(j, k)) {
continue;
}
System.out.println(j+"*"+k+"="+i);
cnt++;
}
}
System.out.println(cnt);
}
}