这个特殊问题不涉及循环,我看到的大部分答案都涉及循环。这是我正在阅读的其中一本书的挑战。不,我不是学生(38岁)我实际上是在转换职业,所以我决定开始学习如何编程。我正在阅读的这本书名为“C#/ Joes 2 Pros简介”。
这是我到目前为止的代码。我知道使用我可能没有很好掌握的东西更有可能做到这一点。例如,我知道什么是“bool”,但还没有在我的任何编码中使用它。因此,很难实现它。
int myChoice;
Console.Write("Please enter a number: ");
myChoice = int.Parse(Console.ReadLine());
if (myChoice >= 1 && myChoice % myChoice == 0)
{
Console.WriteLine("That's correct, {0} is a prime number.", myChoice);
}
else
{
Console.WriteLine("That is not a prime number.");
}
Console.ReadLine();
好的,你可以看到该程序要求用户输入一个数字。由if语句确定,如果数字大于或等于1并且数字本身可以整除而没有余数,则该语句为真。
我知道有更好的方法可以确定输入的数字是否为素数,但我无法弄清楚它是什么。除了弄清楚数字是否为素数之外,该程序还会按照我的预期进行。
这里有一点背景知识。你在屏幕上看到的只是我对C#的了解程度。除了你所看到的,我可能会迷失方向。
有什么建议吗?
答案 0 :(得分:1)
测试素数还有另一个非常具有挑战性的要求,它不能除以任何其他数字。例如,4大于零且4%4 = 0.但是4不是素数,它等于2x2。
对素数的测试相当困难。大多数入门编程书籍都希望您尝试使用Sieve of Eratosthenes,这是一种确定数字是否为素数的旧方法。维基页面提出了一种算法来实现这一点。基本上你在数组中生成1到100的数字并删除那些不是素数的数字,从而使所有素数从1到100。
答案 1 :(得分:1)
如果你的数字 n 很小,那么测试所有小于sqrt(n)
的数字作为除数是很简单的;如果他们都没有划分 n ,那么 n 就是素数:
function isPrime(n)
d := 2
while d * d <= n
if n % d == 0
return Composite
d := d + 1
return Prime
对于更大的数字,对素数的合理检验是米勒 - 拉宾检验;它可以被愚弄(错误地宣称复合数是素数)但可能性非常低。从一个强大的伪试验开始:
function isStrongPseudoprime(n, a)
d := n - 1; s := 0
while d is even
d := d / 2; s := s + 1
t := powerMod(a, d, n)
if t == 1 return ProbablyPrime
while s > 0
if t == n - 1
return ProbablyPrime
t := (t * t) % n
s := s - 1
return DefinitelyComposite
该函数返回ProbablyPrime的每个 a 是 n 的素数的见证;对它们进行足够的测试,你就可以确信 n 实际上是素数:
function isPrime(n)
for i from 1 to k
a := randint(2 .. n-1)
if isStrongPseudoprime(n, a) == DefinitelyComposite
return DefinitelyComposite
return ProbablyPrime
变量 k 是您要执行的试验次数;在10到25之间的某个位置通常是合理的值。 powerMod(b,e,m)
函数返回 b ^ e (mod m )。如果您的语言不提供该功能,您可以像这样有效地计算:
function powerMod(b, e, m)
x := 1
while e > 0
if e % 2 == 1
x := (b * x) % m
b := (b * b) % m
e := floor(e / 2)
return x
如果您对此测试背后的数学感兴趣,我谦虚地在我的博客上推荐论文Programming with Prime Numbers。