【问题标题】:How many prime numbers C programC程序有多少个素数
【发布时间】:2020-11-10 16:45:45
【问题描述】:

我写了这个程序来查找 1 到 50000 之间的素数,但我仍然需要找出有多少个素数(我尝试了很多技巧,但我没有成功)

#include <stdio.h>

//int getValueFromUser();
void PrintListOfPrime(int value);

int main() {
    int value = 23;
    PrintListOfPrime(value);
    return 0;
}

void PrintListOfPrime(int value) {
    int  ValueIsPrime; //ValueIsPrime is used as flag variable

    printf("The list of primes: ");

    for (int i = 2; i <= value; i++) {
        ValueIsPrime = 1;
        /* Check if the current number i is prime or not */
        for (int j = 2; j <= i / 2; j++) {
            /*
             * If the number is divisible by any number
             * other than 1 and self then it is not prime
             */

            if (i % j == 0) {
                ValueIsPrime = 0;
                break;
            }
        }

        /* If the number is prime then print */
        if (ValueIsPrime == 1)
            printf("%d, ", i);
    }
    printf("\n");
}

【问题讨论】:

  • 如果你能列出素数,你不能只增加一个计数器而不是打印所说的素数吗?
  • “我尝试了很多技巧但我没有成功”是模糊的。怎么没成功?
  • @Chouiba Zahira 有 5133 个素数,直到 50000。

标签: c loops for-loop primes function-definition


【解决方案1】:

我尝试了很多技巧,但我没有成功

如果 OP 的代码运行时间过长,则迭代到 i 的平方根,而不是 i/2

j &lt;= i / 2 很慢。请改用j &lt;= i / j


对每个素数形成一个计数和增量。 @gspr

if (ValueIsPrime == 1) {
  printf("%d, ", i);
  prime_count++;
}

“找到 1 到 50000 之间的素数”的更大变化更快,研究Sieve of Eratosthenes

【讨论】:

    【解决方案2】:

    你好,快速的答案是在main中创建一个变量,int totaleOfPrimes = 0;例如。 然后通过引用函数发送它:

    1. 函数声明:void PrintListOfPrime(int value,int* counter);
    2. 函数调用:void PrintListOfPrime(value,&totaleOfPrimes); 然后在打印前增加计数器:
    if (ValueIsPrime == 1){
       (*counter)++;
       printf("%d, ", i);
    }
    

    【讨论】:

      【解决方案3】:

      没有必要为 2 和 value 之间的所有数字迭代循环。您应该只考虑 2 和奇数。

      该函数可以如下面的演示程序所示。

      #include <stdio.h>
      
      static inline size_t PrintListOfPrime( unsigned int n ) 
      {
          size_t count = 0;
      
          printf( "The list of primes:\n" );
      
          for ( unsigned int i = 2; i <= n; i = i != 2 ? i + 2 : i + 1 ) 
          {
              int isPrime = 1;
              /* Check if the current number i is prime or not */
              for ( unsigned int j = 3; isPrime && j <= i / j; j += 2 ) 
              {
                  /*
                   * If the number is divisible by any number
                   * other than 1 and self then it is not prime
                   */
      
                  isPrime = i % j != 0;
              }
      
              /* If the number is prime then print */
              if ( isPrime )
              {
                  if ( ++count % 14 == 0 ) putchar( '\n' ); 
                  printf( "%u ", i );
              }
          }
      
          return count;
      }
      
      int main(void) 
      {
          unsigned int n = 50000;
      
          size_t count = PrintListOfPrime( n );
          
          printf( "\n\nThere are %zu prime numbers up to %u\n", count, n );
          
          return 0;
      }
      

      【讨论】:

        【解决方案4】:

        在 C 中运行此代码。它将返回 pi(x) 函数的值。基本上就是 Prime 计数功能:

        #include <stdio.h>
        #define LEAST_PRIME 2
        #include <math.h>
        
        int main() //works for first 10000 primes.
        {
        int lower_limit = 2, no_of_sets;
        // printf("NUMBER OF SETS: ");
        // scanf("%d", &no_of_sets);
        
        int remainder, divisor = 2, remainder_dump, upper_limit; //upper limit to be specified 
                                                                 //by user.
        int i = 1;
        // printf("SPECIFY LOWER LIMIT: ");
        // scanf("%d", &lower_limit);
        int number_to_be_checked = lower_limit;
        printf("SPECIFY UPPER LIMIT: ");
        scanf("%d", &upper_limit);
        
        printf("2\t\t\t\t", number_to_be_checked);
        //PRINTS 2.*/
        do
        {
            remainder_dump = 1;
            divisor = 2;
        
            do
            {
                remainder = number_to_be_checked % divisor;
                if (remainder == 0)
                {
                    remainder_dump = remainder_dump * remainder; // dumping 0 for rejection.
                    break;
                }
                ++divisor;
        
            } while (divisor <= number_to_be_checked / divisor); // upto here we know number 
        is prime or not.
            if (remainder_dump != 0)
            {
                ++i;
                printf("%d.\t\t\t\t", number_to_be_checked); //print if prime.
            };
            number_to_be_checked = number_to_be_checked + 1;
        } while (number_to_be_checked <= upper_limit);
        printf("\n                                    pi(x) = %d \n", i);
        //printf("pi function value is %f.", (i - 1) / (log(i - 1)));
        float app;
        app = upper_limit / (log(upper_limit));
        float plot_value;
        plot_value = (i) / app;
        printf("                                    BETA FUNCTION VALUE ~ %f", plot_value);
        return 0;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-10-02
          • 1970-01-01
          • 2011-08-04
          相关资源
          最近更新 更多