神奇算式
由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。
比如:
210 x 6 = 1260
8 x 473 = 3784
27 x 81 = 2187
都符合要求。
如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,
一共有多少种满足要求的算式。
请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。
答案:12,,我的思路是遍历所有的四位数,再判断其是否有重复字符,反之则将其记录int数组中,进行全排列且运算是否有满足乘积与之相同。由于两者交换乘积值也满足就出现重复,所以最后的答案需ans/2.
private static int num;
private static int ans;
static int[] ch= {0,0,0,0};
public static void main(String[] args) {
String s = "";
for (int i = 1023; i < 10000; i++) {
s = i + "";
if (isUniqueChars2(s)) {
num=i;
f(0);
}
}
System.out.println(ans/2);
}
private static void f(int pos) {
int x=0;
if(pos>=3) {
for(int a=0;a<3;a++) {
x=x*10+ch[a];
int y=0;
for(int b=a+1;b<4;b++) {
y=y*10+ch[b];
}
if(x*y==num) {
ans++;
}
}
return;
}
for (int i = pos; i < ch.length; i++) {//全排列
int c = ch[pos];
ch[pos] = ch[i];
ch[i] = c;
f(pos + 1);
c = ch[pos];
ch[pos] = ch[i];
ch[i] = c;
}
}
//判断四位数是否有重复字符和四位数转换为int[] 数组
public static boolean isUniqueChars2(String str) {
int[] b = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };//下标重0~9十个数
char[] c = str.toCharArray();
for (int i = 0; i < c.length; i++) {
int num = c[i] - '0';
ch[i]=num;//数字加入到数组
if (b[num] == 1) {
return false;
}
b[num] = 1;//只出现一次标记
}
return true;
}