如何检查用户输入的4个素数是否是连续的?

时间:2016-03-20 15:50:49

标签: c primes sequences

所以我认为我解决了这个问题,但过了一段时间我意识到我的所有代码都是,确保所有输入都是素数,并且前3个输入小于4。反之亦然如果它是从较大到较小的素数序列,那么我如何正确地确保我的所有4个素数都是连续的?素数越高,每个素数之间的差距越大。所以我在这里很难过。还有标志++来检查所有4个输入是否为素数。如果所有4都是素数,那么我的函数返回TRUE。

if(input2 > input1) //This is to know if the sequence is going up or going down, in this case, it's up
    while (x <= input4) { //Creates all prime numbers while X is lesser than or equal to input4
        while (isprime(x) == 0)
            x++;
        if (isprime(x)) { //If x is a prime number, we check if it's one of the inputs, if all 4 inputs are consecutive prime integers, then flag will be 4 after the loop, and we'll know that it's a prime sequence
            if (x == input1)
                flag++;
            if (x == input2)
                flag++;
            if (x == input3)
                flag++;
            if (x == input4)
                flag++;
        }
        x++;
    }

3 个答案:

答案 0 :(得分:0)

我要让函数从input1开始,如果下一个素数不是输入2,我会立即返回0,如果下一个素数是输入2,则重复该过程直到INPUT4。感谢有关Erastothenes Sieve的反馈,但我不允许使用阵列,而Eratothenes'Sieve需要它。所以我会实现我的想法。对于任何因为他们有相同问题而使用谷歌搜索的人,你可以这样做。

y = 0, x = input1; //This 
if(input2 > input1) //This is to know if the sequence is going up or going down, in this case, it's up
        while (x <= input4) { //Creates all prime numbers while X is lesser than or equal to input4
                while (isprime(x) == 0)
                        x++;
                if (isprime(x))
                        y++;
                if (isprime(x)) { //If x is a prime number, we check if it's one of the inputs, if all 4 inputs are consecutive prime integers, then flag will be 4 after the loop, and we'll know that it's a prime sequence
                                //If y is equal to 1, that means that the prime number found is the next input
                        if (x == input1 && y == 1) {
                                flag++;
                                y = 0;
                        }
                        if (x == input2 && y == 1) {
                                flag++;
                                y = 0;
                        }
                        if (x == input3 && y == 1) {
                                flag++;
                                y = 0;
                        }
                        if (x == input4 && y == 1) {
                                flag++;
                                y = 0;
                        }
                }
                x++;
        }

答案 1 :(得分:0)

您可能对Wilson's theorem感兴趣,其中说明了

  

对于候选素数n,当且仅当((n-1)!+ 1)mod n = 0时,n为素数

虽然我意识到您要求使用C语言提供解决方案,但由于“大数字”的广泛多样性,这种解决方案并不容易供应。包等等,可以选择。但是,为了证明这个定理的实现是可能的(并且在给予足够的语言支持的情况下并不困难),我将指出在Clojure(Java VM的Lisp变体)中,这可以实现为

(defn is-prime [n]
  (= (mod (+' (apply *' (range 2 n)) 1) n) 0))

此处不需要数组作为&#34; primeness&#34;在不知道任何其他素数的值的情况下,可以直接确定任何数字。 需要计算潜在大数的因子,因此需要计算一个大数字&#34;数学包可能非常有用,但它确实允许直接确定任何给定数字是否为素数,因此通过迭代从最低值输入到最高值输入的所有数字,它将允许您确定是否存在任何中间质数。

祝你好运。

答案 2 :(得分:0)

你怎么吃大象? One bite at a time。我们需要将这个问题分解为一系列小步骤。从那里开始,这很容易。

我没有向您展示任何代码,而是希望为您列出算法的要点。一些评论表明,最好的方法是使用数组来制作筛子。

我认为应该使用数组,但不一定要创建筛子。相反,要处理用户输入的值。但是,根据老师的荒谬要求,我们不允许使用阵列。这很好 - 这意味着我们的算法可以处理任意数量的输入。这是相当短视的,但很好。

以下是步骤(听起来有些步骤已经解决了。)

  1. 收集用户输入。
  2. 将用户的输入从最低到最高排序。
  3. 从最低的用户数开始,我们已经知道它是素数,增加两倍(全部,检查每个值以确定它是否是素数。如果我们在遇到下一个用户输入之前遇到素数,我们得到了结果。
  4. 对第2个到第3个数字重复此过程,第3个到第4个,如果有输入数组,请继续,直到到达数组末尾。
  5. 我希望在此计划中看到一些功能:

    bool isPrime(int value);
    int nextPrime(int startingPrime);
    

    因此,在按顺序对值进行排序后,您会看到类似......

    的内容
    isPrime(value1) && value2 == nextPrime(value1) && value3 == nextPrime(value2) && value4 == nextPrime(value3)