好的,我想从控制台输入一个整数,并检查数字是否为素数。 我挖了一个代码,然后根据我的需要对其进行了转换,但计算不正确。
using System;
class PrimeNumber
{
static void Main()
{
Console.Write("Type a number: ");
string line = Console.ReadLine(); // Read string from console
int value;
if (int.TryParse(line, out value)) // Try to parse the string as an integer
{
int x = 0;
if (value == 1) Console.WriteLine("not prime");
if (value == 2) Console.WriteLine("prime");
for (int i = 3; i < value*value; i+=2)
{
if (value % 2 == 0) x++; break;
if (value % i == 0) x++; break;
}
Console.WriteLine(x);
if (x == 0) Console.WriteLine(value + " is prime");
else Console.WriteLine(value + " is not prime");
}
else
{
Console.WriteLine("Invalid input.");
}
}
}
答案 0 :(得分:5)
问题在于:
if (value % 2 == 0) x++; break;
if (value % i == 0) x++; break;
break
语句不是if
的一部分,只有x++
是...所以break
是总是执行,无论条件是否为真。
你应该用大括号括起来:
if (value % 2 == 0) { x++; break; }
if (value % i == 0) { x++; break; }
另外两个问题:
if (value % 2 == 0)
放在循环之外,因为在每次迭代时再次检查它是没用的。sqrt(value)
(包括)的迭代,而不是value²
。如果您转到value²
,则某时i
将等于value
,因此value % i
将为0,且该数字不会被视为素数。答案 1 :(得分:2)
这是查找数字是否为素数的有效方法。
static bool IsPrime(int n)
{
for(int i = 2; i <= Math.Sqrt(n); i++)
{
if(n % i == 0)
return false;
}
return true;
}
答案 2 :(得分:0)
您还可以使用eratosthenes筛,有效生成素数: 我的实施:
static int[] GenerateEratosthen()
{
bool[] e = new bool[200000];
for (int i = 2; i < 200000; i++)
{
for (int j = 2; j * i < 200000; j++)
{
e[j * i] = true;
}
}
int[] p = new int[20000];
int k = 0;
for (int i = 1; i < 200000; i++)
{
if (!e[i])
p[k++] = i;
}
return p;
}