簡體   English   中英

使用 Java 中的排列來求解方程

[英]Using Permutations in Java for solving an equation

對於給定的問題,我被授予兩個數字,它們將以這種方式求和為某個結果:

num1 + num2 = result

然而,這些數字將被“編碼”,因此,例如,輸入可能是:

ab + bc = acd

數字可以有任意長度,最多 9 位。

我的任務是創建一種有效的方法來查找每個輸入有多少可能的解決方案,或者是否不可能。

我通過創建一個名為 Number(在 Java 中)的 class 解決了這個問題,它有一個字母(char 類型)和一個數值(int),然后我將每個數字轉換為這個新的 class 數字的數組,所以我可以很容易地檢查它們的當前值。

但是我不太確定如何處理這個回溯問題。

我知道我應該開始比較 number1 和 number2 的單位,然后是十位,依此類推,在每個“級別”中只選擇總和合乎邏輯的情況,例如在上面的單位示例中b=2 和 c= 3 只有當 d=5 時才有意義,對於這兩個預先存在的值,我可以丟棄 d.= 5 的所有其他情況。

有人告訴我可以只使用兩個循環來覆蓋所有這些排列:一個用於循環可能的數字 [0 到 9],一個用於覆蓋所有字母/變量,但我不太明白如何完成!

如果我必須想象它,我想我可以把它想象成

for cycle ( through "columns" from the rightmost up to the leftmost column of the shortest number)
  for cycle( for numbers 0 to 9?) 

但是我仍然無法圍繞這個主題的這種方法,或者我如何用遞歸來解決這個問題,非常感謝所有有助於提高我的理解的方法。

這是一種應該有效的算法。

讓我們以您的示例等式為例:

ab + bc = acd
  1. 確定等式中唯一字符的數量。 在您的示例中,這將是四個(a、b、c、d)。

  2. 為了遍歷所有的可能性,我們將建立一個循環。 此循環的最小值為 10 ^ 3 或 1,000。 此循環的最大值為 10 ^ 4 或 10,000。 等式中唯一字符的數量決定了您將使用的 10 的次方。 最大值為 10 ^ 10,大於int 一個long的工作。

  3. 在迭代中,將索引拆分為 N 位數字。 在您的示例中,這將是 4 位數字。 由於我們從 1,000 迭代到 9,999(包括 10,000)(不包括 10,000),因此所有索引值都將具有 4 位數字。

  4. 檢查以確保 N 位數字是唯一的。 沒有重復。 這將在開始時消除大部分索引值。

  5. 將數字代入方程式並檢查方程式是否有效。 如果是這樣,請將等式保存在List<String>中。

  6. Output List值或完成迭代后未找到解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM