用任一语言解答,编程该如何解释

比如 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