以下是我的代码中的代码段。基本上,一旦单击该按钮,该逻辑应该触发并确定该数字是否为素数。问题是有些数字正在返回“不是素数”,实际上它们是。谁能指出这个缺陷在哪里?
谢谢
private void bntTestPrime_Click(object sender, EventArgs e)
{
int num;
double num_sqrt;
int num_fl;
num = Convert.ToInt32(txtInput.Text);
num_sqrt = Math.Sqrt(num);
num_fl = Convert.ToInt32(Math.Floor(num_sqrt));
for (int i = 1; i <= num_fl; i++)
{
if (num % i == 0 && i != num)
lblResult_prime.Text = "Number " + num + " is not Prime.";
else
lblResult_prime.Text = "Number " + num + " is Prime.";
}
}
答案 0 :(得分:1)
1是每个数字的因子,因此您不应该检查它。从2开始。此外,您已经从2循环到sqrt(num)
,因此i
无法等于num
。
答案 1 :(得分:1)
要添加到Blender's answer,我想指出您只是在每个迭代循环上设置输出文本。这意味着您的结果将仅取决于检查的最后一个数字。你需要做的是假设数字是素数并循环直到找到除数。如果找到除数。当且仅当没有找到除数时,该数字才是素数。最后代码看起来像这样:
private bool IsPrime(int num)
{
double num_sqrt = Math.Sqrt(num);
int num_fl = Convert.ToInt32(Math.Floor(num_sqrt));
for (int i = 2; i <= num_fl; i++)
{
if (num % i == 0)
{
return false;
}
}
return true;
}
private void bntTestPrime_Click(object sender, EventArgs e)
{
int num = Convert.ToInt32(txtInput.Text);
bool isPrime = IsPrime(num);
if (isPrime)
lblResult_prime.Text = "Number " + num + " is Prime.";
else
lblResult_prime.Text = "Number " + num + " is not Prime.";
}
答案 2 :(得分:1)
你可以通过使用条件检查前4个素数来减少检查大数字的性能,然后在11开始循环并增加2.这样的事情:
private bool IsPrime(int num)
{
double num_sqrt = Math.Sqrt(num);
int num_fl = Convert.ToInt32(Math.Floor(num_sqrt));
if (num !=1 && num !=2 && num != 3 && num != 5 && num != 7 && num % 2 > 0 _
&& num % 3 > 0 && num % 5 > 0 && num % 7 > 0)
{
for (int i = 11; i <= num_fl; i+=2)
{
if (num % i == 0)
{
return false;
}
}
}
else
return false;
return true;
}
通过使用足够大的素数列表来覆盖您想要检查的上限,您可以缩短代码并极大地提高性能。然后使用Contains方法测试素数。
答案 3 :(得分:0)
尝试以下代码。
bool IsPrime(int number) {
if(number%2==0 && number!=2) return false; //no need to check for even numbers
for (int i = 2; i < number; i++) {
if (number % i == 0 && i != number) return false;
}
return true;
}
答案 4 :(得分:0)
请尝试以下代码:
bool isPrimeNubmer(int n)
{
if (n >=0 && n < 4) //1, 2, 3 are prime numbers
return true;
else if (n % 2 == 0) //even numbers are not prime numbers
return false;
else
{
int j = 3;
int k = (n + 1) / 2 ;
while (j <= k)
{
if (n % j == 0)
return false;
j = j + 2;
}
return true;
}
}
答案 5 :(得分:0)
public class PrimeChecker
{
public static bool Prime(int m)
{
for (int i =2; i< m; i++)
{
if (m % i ==0)
{
return false ;
}
}
return true;
}
public static void Main()
{
Console.WriteLine(Prime(13));
}
}