2016-03-22 46 views
0

我必須返回兩個數字,其階乘和等於10!兩個數字應該返回數組中。我已經完成了如下代碼,但是它找不到任何這樣的兩個數字。它以「堆棧溢出異常」結束。 我的代碼是:什麼是兩個數字x和y,使得x和y的階乘和等於階乘10

private int[] solve10() 
    { 
     int[] n = new int[2]; 
     bool found=false; 
     int c1 = 1; 
     int fact1 = 0; 
     int fact2 = 0; 
     int fact10 = 0; 
     try 
     { 
      fact10 = findFactorial(10); 
      while(!found) 
      { 
       fact1 = findFactorial(c1); 
       for (int j = 1; j < 10;j++) 
       { 
        fact2 = findFactorial(j); 
        if (fact1+fact2==fact10) 
        { 
         n[0] = c1; 
         n[1] = j; 
         found = true; 
         break; 
        } 

       } 
       c1++; 
      } 
      return n; 
     } 
     catch (Exception ex) 
     {     
      throw ex; 
     } 
    } 

findFactorial是一個返回factorial的函數。其定義如下

private int findFactorial(int n) 
    { 
     int fact = 0; 
     try 
     { 
      if(n==0 || n==1) 
      { 
       fact= 1; 
      } 
      else 
      { 
       fact= n * findFactorial(n - 1); 
      } 
      return fact; 
     } 
     catch (Exception ex) 
     { 

      throw ex; 
     } 
    } 
+1

這在前面[SO Post]中討論過(http://stackoverflow.com/questions/25135435/c-sum-of-two-factorials-euals-factorial-of-10-find-two-values-say -x-and-y-whos),更有趣的是答案中的「點3」。 –

+0

爲什麼你在那裏有一個'try' /'catch'塊?你期待什麼異常會拋出你可以從中恢復? – Enigmativity

+1

我沒有注意到,但是你都有'try' /'catch'。這是你如何寫你的所有代碼?這是一個不好的做法。 – Enigmativity

回答

1

現在,在數學上講,n! > 2 x (n - 1)!對於所有的n > 2。換句話說,不存在一對來自[1..9]的數字,使得階乘的總和等於10階乘。沒有解決方案。

您的代碼存在的問題是break只有在您得到解決問題的解決方案時纔會觸發。

沒有解決方案。

因此,您的代碼將永久循環while,遞增c1,直到findFactorial(c1)的調用導致堆棧溢出。

-4

你的問題是你正在遞歸地做這件事,而且這對堆棧空間非常密集。我的建議是重寫,所以它只是迭代;儘管遞歸地編寫它在認知上更簡單,但所有這些方法調用實際上是相加的。如果它是爲某個任務或某事而你必須遞歸執行,則添加一些堆棧空間。

How to change stack size for a .NET program?

+0

你真的相信10個遞歸調用會導致堆棧溢出嗎? –

+0

你有另一種假設嗎? – user1385417

+1

不,我不需要假設 - 我知道答案。 :) –

0

C++ sum of two factorials euals factorial of 10 find two values say x and y whose factorials sums up在{0,1}對的唯一解決方案進行討論。

由於樣本中的搜索從1開始,因此根本找不到解。所以while循環不會停止。注意,在表達式c1! + i!中,最大值c1根本不受限制(不同於屬於1-10範圍的i)。這會導致計算更大更大數字的階乘,直到StackOverflow發生在14000左右!

修復 - 在c1爲10或嵌套for循環0-10而不是while(found)時,用0開始這兩個值並停止迭代。


注意的是,由於溢出整數計算的行爲是確定以重計算大數階乘像100!與代碼所示(也返回0爲Why computing factorial of realtively small numbers (34+) returns 0所示),直到你得到堆棧溢出遞歸代碼非常大(對我來說大約是14000)數字。