比如 34*86=43*68,也就是说,如果把他们的十位数和个位数交换,二者乘积不变。
编程求出满足该性质的两位数组合
提示,暴力解法非最优解
12*21=21*12
public class demo {
public static void main(String[] args) {
fun();
}
private static void fun() {
Set<String> set=new HashSet<>();
for (int i = 10; i <= 99; i++) {
for (int j = i + 1; j <= 99; j++) {
if (i != j && Math.abs(j - i) % 9!=0 && i % 11 != 0 && j % 11 != 0 && i * j == con(i) * con(j)&&!set.contains(i+""+j)) {
set.add(i+""+j);
set.add(con(i)+""+con(j));
System.out.println(i + "X" + j + "=" + con(i) + "X" + con(j)); }
}
}
}
private static int con(int num) {
int units = num % 10;
int tens = num / 10;
return units * 10 + tens;
}
}
先暴拆一波
首先,这个问题的量很少,O(n^2),n=90;
其次,我们可以很快的想到一些平凡解,比如xy*yx的形式都满足;
最后,我们可以用一些技巧加速判断,所以实际的计算量非常小。
Sub ab乘以cd等于ba乘以dc()
Dim a%
Dim b%
Dim c%
Dim d%
Dim e%
Dim f%
For a = 1 To 9
For b = 1 To 9
Cells(a, b) = a & b
Next b
Next a
For a = 1 To 9
For b = 1 To 9
For c = 1 To 9
For d = 1 To 9
If Cells(a, b) * Cells(c, d) = Cells(b, a) * Cells(d, c) Then
e = a + b + 9
f = c + d - 1
Cells(e, f) = Cells(a, b) & "*" & Cells(c, d) & "=" & Cells(b, a) & "*" & Cells(d, c)
End If
Next d
Next c
Next b
Next a
End Sub