【问题标题】:How to check if 4 prime numbers inputted by the user are sequential?如何检查用户输入的4个素数是否连续?
【发布时间】:2016-07-07 01:41:42
【问题描述】:

所以我以为我解决了这个问题,但过了一会儿我意识到我的所有代码都是确保所有输入都是素数,并且前 3 个输入小于第 4 个。反之亦然,如果它是从大到小的素数序列,那么我如何正确确保我的所有 4 个素数都是连续的?素数越高,每个素数之间的差距就越大。所以我在这里很困惑。还有 flag++ 可以检查所有 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++;
    }

【问题讨论】:

  • 恕我直言,一个简单的解决方案是使用 Eratosthene 的筛子来查找所有小于用户给出的最高值的素数。这样一来,它们是否是连续的就很明显了。
  • 在给定范围内实施 Erastothenes Sieve,例如。 200-250。这将比 isprime 在顺序整数上更有效。
  • @SergeBallesta 谢谢,但是看看网上的 C 实现,我必须使用数组,好吧,我不允许这样做。
  • 不允许使用数组?这是荒谬的。顺序,你的意思是(x1 &lt; x2) &amp;&amp; (x2 &lt; x3) &amp;&amp; (x3 &lt; x4)?在这种情况下,只需检查这个不等式是否为真,然后检查它们是否都是素数。或者你的意思是它们之间也不应该有其他素数?如果他们是平等的呢?
  • @Groo 好吧,这是一个限制。这显然是为了帮助我们“跳出框框思考”。不,不是那样,只是中间没有其他素数。例如,给定 1、2、3、5 作为输入。程序将打印“显示的素数系列”“下一个数字是 7”,如果输入是 1、3、5、11,程序应该说“没有关系”,因为找不到序列。我的程序的目标是,给定用户的 4 个整数输入,确定 4 个数字显示的序列。比如+n -m、*n +m等

标签: c primes sequences


【解决方案1】:

我打算让函数从 input1 开始,如果下一个素数不是输入 2,我会让它立即返回 0,如果下一个素数是输入 2,则重复该过程直到输入4。感谢您对 Eratothenes Sieve 的反馈,但是,我不允许为此使用数组,而 Eratothenes 的 Sieve 需要它。所以我将实现我的想法。对于任何因为遇到相同问题而使用 Google 搜索的人,您都可以这样做。

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++;
        }

【讨论】:

    【解决方案2】:

    您可能对Wilson's theorem 感兴趣,其中指出

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

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

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

    这里不需要数组,因为可以直接确定任何数字的“素数”,而无需知道任何其他素数的值。它确实需要计算潜在大数的阶乘,因此“大数”数学包可能非常有用,但它确实允许直接确定任何给定数是否为素数,因此通过迭代所有从最低值输入到最高值输入的数字,它可以让您确定是否有任何中间素数。

    祝你好运。

    【讨论】:

    • 应该是 'iff n 是素数'!
    • @pat - 我改写了定理的陈述。谢谢。
    【解决方案3】:

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

    我不想向您展示任何代码,而是想为您列出算法的要点。一些 cmets 建议最好的方法是使用数组来创建筛子。

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

    这是步骤(听起来其中一些已经解决了)。

    1. 收集用户输入。
    2. 将用户的输入从低到高排序。
    3. 从我们已经知道是素数的最低用户编号开始,递增 2 (all ,检查每个值以确定它是否是素数。如果在遇到下一个用户输入之前遇到素数,我们有结果了。
    4. 对第 2 到第 3 个数字、第 3 到第 4 个数字重复此过程,如果您有输入数组,请继续直到到达数组末尾。

    我希望在这个程序中看到的一些功能:

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

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

    isPrime(value1) && value2 == nextPrime(value1) && value3 == nextPrime(value2) && value4 == nextPrime(value3)
    

    【讨论】:

      猜你喜欢
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      • 2021-11-29
      • 1970-01-01
      • 2019-05-23
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      相关资源
      最近更新 更多