我遇到任务问题。如果号码是素数,我需要找到并提醒用户。
这是我的代码:
int a = Convert.ToInt32(number);
if (a % 2 !=0 )
{
for (int i = 2; i <= a; i++)
{
if (a % i == 0)
{
Console.WriteLine("not prime");
}
else
{
Console.WriteLine("prime");
}
Console.WriteLine();
}
}
else
{
Console.WriteLine("not prime");
}
Console.ReadLine();
我哪里出错,我该如何解决?
答案 0 :(得分:2)
素数可以被1整除,你自己需要检查数字是否有一个从一个到数字的正好两个除数然后它是素数。
int devisors = 0;
for (int i = 1; i <= a; i++)
if (a % i == 0)
devisors++;
if (devisors == 2)
Console.WriteLine("prime");
else
Console.WriteLine("not prime");
你可以跳过一次迭代,因为我们知道所有整数都可以被1整除,那么你将完全取代素数的除数。由于1只有一个除数,我们需要跳过它,因为它不是素数。所以条件是只有一个除数而不是1的数字,而数字不应该是1,因为一个不是素数。
int devisors = 0;
for (int i = 2; i <= a; i++)
if (a % i == 0)
devisors++;
if (a != 1 && devisors == 1)
Console.WriteLine("prime");
else
Console.WriteLine("not prime");
答案 1 :(得分:1)
你刚刚打印了素数或非素数,并继续循环,而不是停止。不需要%2
检查。适当修改:
int a = Convert.ToInt32(number);
bool prime = true;
if (i == 1) prime = false;
for (int i = 2; prime && i < a; i++)
if (a % i == 0) prime = false;
if (prime) Console.WriteLine("prime");
else Console.WriteLine("not prime");
Console.ReadLine();
答案 2 :(得分:0)
据推测,你的代码正在输出大量的消息,这些消息看似混乱且毫无意义?有三个关键问题:
当你认为它不能成为主要时,你不会打破你的for循环
您认为它可能不是最佳状态,请参阅下面代码中的注释。
您正在与自身进行比较,并且总是可以被a整除,而条件中的&lt; =需要&lt;
代码:
int a = Convert.ToInt32(number);
if (a % 2 != 0)
{
for (int i = 3 i < a; i += 2) // we can skip all the even numbers (minor optimization)
{
if (a % i == 0)
{
Console.WriteLine("not prime");
goto escape; // we want to break out of this loop
}
// we know it isn't divisible by i or any primes smaller than i, but that doesn't mean it isn't divisible by something else bigger than i, so keep looping
}
// checked ALL numbers, must be Prime
Console.WriteLine("prime");
}
else
{
Console.WriteLine("not prime");
}
escape:
Console.ReadLine();
正如其他人所提到的,你只能循环到a的平方根,通过对平方根进行评估并替换这一行:
for (int i = 3 i < a; i += 2)
用这个:
float sqrRoot = (Int)Math.Sqrt((float)a);
for (int i = 3 i <= sqrRoot; i += 2)
重要的是要对其进行评估,否则你的程序运行速度会慢得多,而不是更快,因为每次迭代都会涉及平方根操作。
如果您不喜欢goto语句(我喜欢goto语句),请发表评论并将其替换为爆发布尔值(或查看Dukeling的最新答案)。
答案 3 :(得分:0)
public bool isPrime(int num)
{
for (int i = 2; i < num; i++)
if (num % i == 0)
return false;
return num == 1 ? false : true;
}
答案 4 :(得分:0)
另一种优化方法是使用Sieve of Eratosthenes算法。
通过Eratosthenes的方法找到小于或等于给定整数n的所有素数:
1.创建从2到n的连续整数列表:(2,3,4,...,n) 2.最初,让p等于2,即第一个素数 3.从p开始,以p为增量进行计数,并在列表中将每个数字标记为大于p本身。这些是p:2p,3p,4p等的倍数;请注意,其中一些可能已被标记 4.在列表中找到未标记的第一个大于p的数字。如果没有这样的号码,请停止。否则,让p现在等于这个数字(这是下一个素数),并从步骤3开始重复。
When the algorithm terminates, all the numbers in the list that are not marked are prime.
C#代码
int[] GetPrimes(int number) // input should be greater than 1
{
bool[] arr = new bool[number + 1];
var listPrimes = new List<int>();
for (int i = 2; i <= Math.Sqrt(number); i++)
{
if (!arr[i])
{
int squareI = i * i;
for (int j = squareI; j <= number; j = j + i)
{
arr[j] = true;
}
}
for (int c = 1; c < number + 1; c++)
{
if (arr[c] == false)
{
listPrimes.Add(c);
}
}
}
return listPrimes.ToArray();
}
答案 5 :(得分:0)
我做了太多的检查。
我这样做了:
bool isPrime = true;
List<ulong> primes = new List<ulong>();
ulong nCheck, nCounted;
nCounted = 0;
nCheck = 3;
primes.Add(2);
for (; ; )
{
isPrime = true;
foreach (ulong nModulo in primes)
{
if (((nCheck / 2) + 1) <= nModulo)
{ break; }
if (nCheck % nModulo == 0)
{ isPrime = false; }
}
if (isPrime == true)
{
Console.WriteLine("New prime found: " + (nCheck) + ", prime number " + (++nCounted) + ".");
primes.Add(nCheck);
}
nCheck++;
nCheck++;
}
这不完全是你正在寻找的东西,所以我要做的是将它放在后台工作者中,但将ulongs列表作为并发列表,或者你可以在2个线程中访问的东西。或者只是在访问列表时锁定列表。如果尚未解决这个问题,请等到它。
答案 6 :(得分:0)
private static void checkpirme(int x)
{
for (int i = 1; i <= x; i++)
{
if (i == 1 || x == i)
{
continue;
}
else
{
if (x % i == 0)
{
Console.WriteLine(x + " is not prime number");
return;
}
}
}
Console.WriteLine(x + " is prime number");
}
其中x是要检查是否为素数的数字