【题目】
由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。
比如:
210 x 6 = 1260
8 x 473 = 3784
27 x 81 = 2187
都符合要求。
如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。
请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。
————————————————
思路:枚举(在这个过程中排除重复数字)+判断两个数字所含的数字是否相同
判断两个数字所含的数字是否相同:先将数字转化为字符串,再将字符串转化为字符数字,然后用API对字符数组进行排序,最后转为字符串进行equals。
代码:
package pastExamPaper;
import java.util.Arrays;
/*
神奇算式
*/
public class Demo26 {
static int ans;
public static void main(String[] args) {
for (int a = 1; a < 10; a++) {
for (int b = 0; b < 10; b++) {
if (b != a) {
for (int c = 0; c < 10; c++) {
if (c != a && c != b) {
for (int d = 0; d < 10; d++) {
if (d != a && d != b && d != c) {
int num = a * 1000 + b * 100 + c * 10 + d;//刚开始把这里想复杂了,实际上枚举已经将所有情况都考虑了
//接下来只要考虑*在第一个数字后面还是第二个数字后面,不需要考虑第三数字后面的*
// 原因:同上,枚举已经将所有情况都考虑进去了
//先考虑*在第一个数字后面,此时b不能为0
if (b != 0) {
int r1 = a * (b * 100 + c * 10 + d);
if ( check(num, r1)) {
ans++;
System.out.printf("%d*%d = %d\n",a,b * 100 + c * 10 + d,r1);
}
}
if ( c != 0 ){
int r2 = (a*10+b)*(c*10+d);
if ( (a*10+b) < (c*10+d) && check(num,r2) ){
ans++;
System.out.printf("%d*%d = %d\n",a*10+b,c*10+d,r2);
}
}
}
}
}
}
}
}
}
System.out.println(ans);
}
//判断num和r两个所含的数字相同且不重复
private static boolean check(int num, int r){
String s1 = String.valueOf(num);
String s2 = String.valueOf(r);
char[] chars1 = s1.toCharArray();
char[] chars2 = s2.toCharArray();
Arrays.sort(chars1);
Arrays.sort(chars2);
return new String(chars1).equals(new String(chars2));
}
}