2013-06-22 35 views
1

我正在嘗試解決一個使用matlab的謎題。 這是關於matlab的更多關於謎語本身的信息(謎語來自日報)。求解2個方程 - 9個未知數,帶約束。

謎語給出了由字母表示的兩個3位數字。我需要找到不參與的數字(0-9)。

aba-dcc = efe; aba + dcc = ghi

現在,我有2個等式和9個未知數。 我設法通過在while循環中檢查矢量0:9的所有排列來解決它。

vecAns = 0:9; 
P = perms(vecAns); 
P = P(:,1:9); 

A = [ 101 10 -100 -11 -101 -10 0 0 0 ;... 
     101 10 100 11 0 0 -100 -10 -1]; 

resVec = [0;0]; 
found=false; 

i=1; 
h = waitbar(0,'Computing'); 
while found==false 
     Res=A*P(i,:)'; 
     if (Res(1)==0)&&(Res(2)==0) 
      break; 
     end 
     i=i+1; 
     waitbar(i/length(P),h,sprintf('%d%%',i/length(P)*100)); 
end 
close(h) 

有沒有一種方法(無需添加數學考慮)來解決問題。例如,我知道所有未知數都必須是整數,範圍在0-9之間。

如果沒有辦法。如何使它更有效率?

回答

1

您不必一一列舉全部的排列組合。您可以從前4位數字開始(a,b,cd),並檢查它們是否產生與efeghi匹配的差異和總和。您還需要確保所有數字都不同。

我不以書面形式MATLAB代碼很精通,所以我會用C#代碼演示了它:

//aba-dcc=efe 
//aba+dcc=ghi 
for (int a = 1; a <= 9; a++) // 'a' cannot be zero 
for (int b = 0; b <= 9; b++) 
if (a != b) 
for (int c = 0; c <= 9; c++) 
if (c != a && c != b) 
for (int d = 1; d <= 9; d++) // 'd' cannot be zero 
if (d != a && d != b && d != c) 
{ 
    int aba = a*101 + b*10; 
    int dcc = c*11 + d*100; 

    int efe = aba - dcc; 
    if (efe < 0) continue; 

    int ghi = aba + dcc; 
    if (ghi > 999) continue; 

    int e = efe % 10; 
    if (e == a || e == b || e == c || e == d) continue; 

    int f = (efe/10)%10; 
    if (f == a || f == b || f == c || f == d || f == e) continue; 

    if (efe != e*101 + f*10) continue; 

    int i = ghi%10; 
    if (i == a || i == b || i == c || i == d || i == e || i == f) continue; 

    int h = (ghi/10)%10; 
    if (h == a || h == b || h == c || h == d || h == e || h == f || h == i) continue; 

    int g = (ghi/100)%10; 
    if (g == a || g == b || g == c || g == d || g == e || g == f || g == i || g == h) continue; 

    Console.WriteLine("{0:d3}-{1:d3}={2:d3} ; {0:d3}+{1:d3}={3:d3}", aba, dcc, efe, ghi); 
} 

這就完成了不到我的電腦上一毫秒。

輸出:

717-233=484 ; 717+233=950 

(。%是模量,並且是/整數除法continue跳到迴路的下一個迭代)

+0

這是很大的。爲了適應更一般的情況,我進行了一些改進,但僅使用4位數字的想法就是我所期待的。謝謝! –