【问题标题】:How to print out more than one Pair of prime numbers如何打印出一对以上的素数
【发布时间】:2020-03-02 19:26:17
【问题描述】:

这是代码的一部分,它只打印出一对素数(1 3)。如何打印出 10000 之前的所有对? (1 3) (5 7)...直到 10000

    int paarPrim = -1;
for(int max = 2; max < 10000; max++) {
    if(isPrim(max)) {
        if(max - paarPrim <= 2) {
            printf("(%i %i)", paarPrim, max);
        }
            paarPrim = 1;

    }
}

【问题讨论】:

  • 1 不是素数。
  • 什么是素数对? (3 5) 不是一对吗?
  • 如果你想输出两个一组的所有素数,你可以在检测到素数时输出它们,然后考虑逻辑在正确的位置输出括号。 - 要控制这一点,应该使用一个状态变量bool inPair
  • 我认为像 (3,5) (5,7) (11,13) (17,19) 这样的输出是有效的。所以实际上是一对相差2的素数

标签: c loops for-loop compilation primes


【解决方案1】:
#include "stdio.h"

int is_prime(int num)
{
    if (num <= 1) return 0;
    if (num % 2 == 0 && num > 2) return 0;
    for (int i = 3; i < num / 2; i += 2)
    {
        if (num % i == 0)
            return 0;
    }
    return 1;
}




int main()

{

int prim_arry[10000];
int p = 0;

for (int max = 2; max < 10000; max++) 
{
    if (is_prime(max)) 
    {

        prim_arry[p++] =max;
    }
}

for (int i = 0; i < p; i+=2)
{
    if (i == p - 1)
    {
        printf("(%d)", prim_arry[i]);
    }
    else
    {
        printf("(%d,%d)", prim_arry[i], prim_arry[i + 1]);
    }

}
}

【讨论】:

    【解决方案2】:

    看来你需要的是类似下面的东西

    #include <stdio.h>
    
    int is_prime( unsigned long long int n )
    {
        int prime = n % 2 == 0 ? n == 2 : n != 1;
    
        for ( unsigned long long int i = 3; prime && i <= n / i; i+= 2 )
        {
            prime = n % i != 0;
        }
    
        return prime;
    }
    
    int main(void) 
    {
        const unsigned int UPPER_VALUE = 1000;
    
        for ( unsigned int i = 2, prev = 0, first = 0; i < UPPER_VALUE; i++ )
        {
            if ( is_prime( i ) )
            {
                if ( first ^= 1 )
                {
                    prev = i;
                }
                else if ( i - prev <= 2 )
                {
                    printf( "(%u, %u) ", prev, i );
                }
                else
                {
                    first = 1;
                    prev = i;
                }
            }
        }
    
        putchar( '\n' );
    
        return 0;
    }
    

    程序输出是

    (2, 3) (5, 7) (11, 13) (17, 19) (29, 31) (41, 43) (59, 61) (71, 73) (101, 103) 
    (107, 109) (137, 139) (149, 151) (179, 181) (191, 193) (197, 199) (227, 229) 
    (239, 241) (269, 271) (281, 283) (311, 313) (347, 349) (419, 421) (431, 433) 
    (461, 463) (521, 523) (569, 571) (599, 601) (617, 619) (641, 643) (659, 661) 
    (809, 811) (821, 823) (827, 829) (857, 859) (881, 883) 
    

    在程序中,我使用常量UPPER_VALUE 等于1000 而不是10000 来限制输出。:) 当然,您可以使用等于10000 的常量或任何其他值。

    您还可以优化循环,将第一对 (2, 3) 的输出移动到循环外并定义循环本身,如

        for ( unsigned int i = 5, prev = 0, first = 0; i < UPPER_VALUE; i += 2 )
    

    【讨论】:

      猜你喜欢
      • 2018-04-09
      • 1970-01-01
      • 2021-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-31
      • 1970-01-01
      相关资源
      最近更新 更多