2017-08-11 68 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)); 
}