2017-08-11 26 views
-4

我寫了代碼,它應該告訴P的最小值是什麼,它會使整個sqrt成爲一個自然數。 問題在於,每當它到達P = K的部分時,循環停止並表示這是相同的值。 例如:4號它完美,但對於5它說,他們是平等的,但在45開方是不是自然數在C中尋找一個自然數#

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication10 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      int k, p = 0; 
      double final; 
      Console.WriteLine("Please enter the value of K "); 
      k = int.Parse(Console.ReadLine()); 
      final = System.Math.Sqrt(4 * k + System.Math.Pow(p, 2)); 
      while (final - (int)(final) != 0&&p!=k) 
      { 
       final = System.Math.Sqrt(4 * k + System.Math.Pow(p, 2)); 
       p++; 
      } 
      Console.WriteLine("k is {0}, and P is {1}", k, p); 
     } 
    } 
} 
+7

代碼,以什麼語言寫不會做你認爲它*有*做,直到你*讓*它做。 –

+3

代碼是由您編寫的,如果它不起作用... – dcg

+0

更像是第8層上的錯誤 – Fabiano

回答

0

注:這不是明確地在這個問題說,但我假設K爲自然數(不是負數!),否則解決方案變得更復雜。

允許重新審視了問題的下界和上界:

下界是相當簡單:Q² == 4K因此,P == 0

的上限是由Q² == (K+1)² == 4K + (K-1)²給出,所以P == K-1(assumung K > 1因爲K == 0K == 1的情況很平凡,並且上限等於下限)。

這意味着,期望找到有效P之前P == K(或在K == 0話,那麼P == 0)是一個有效的(這是不是很明顯,我當首先看問題)。

因此,我們來看看爲什麼你的代碼找不到[0, K-1]範圍內的結果。

基本上,原因是你計算一個子結果final,然後在測試結果之前更改p。因此,只要您找到有效結果final,就會錯誤地輸出值p+1作爲結果。

解決辦法:改變你的循環語句的順序:

while (final - (int)(final) != 0&&p!=k) 
{ 
    p++; 
    final = System.Math.Sqrt(4 * k + System.Math.Pow(p, 2)); 
}