【问题标题】:Prime Numbers Optimization in C [closed]C中的素数优化[关闭]
【发布时间】:2013-03-17 18:41:05
【问题描述】:

我尝试打印素数; 2到100万。但是控制台上没有打印任何内容。你能检查我的代码吗?我怎样才能使这段代码更加优化?

这是我的代码:

#include <stdio.h>
#include <math.h>

main()
{
   int num, sr, num2;

   for (num = 2; num <= 1000000; num++) {
      sr = (int) sqrt(num);
      for (num2 = 2; sr % num2 != 0; num2++) {
         if (sr == num2) {
            printf("%d\n", sr);
         }
      }
   }

}

【问题讨论】:

  • 在你的调试器中单步调试代码,错误应该立即显而易见。
  • 提示:如果sr == 1num2 &gt;= 2sr%num2 会是什么?
  • 您可以通过注意所有超过 3 的素数都是 6k+1 或 6k-1 的形式来优化它。

标签: c primes


【解决方案1】:

编译成功了吗?

第 4 行:main() 应该是 int main()?

另一件事:sr = 1。1 模任何数都是 1。

最后。 sr 永远不会等于 num2,因为 sr 是 1,而 num2 是 2 或更大,所以它永远不会打印任何东西。

这会让你进入一个什么都不做的无限循环

【讨论】:

    【解决方案2】:

    如果你想优化它,你应该使用像eratosthenes筛子这样的东西。它很容易对你的数据范围进行操作。你可以在这里读更多关于它的内容 : http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

    【讨论】:

      【解决方案3】:
          #include <stdio.h>
          #include <math.h>
      
          int main(){
          int num, sr, num2;
          int isPrime = 1; // this is a check parameter; isPrime = 0 if number is not prime.
          for(num=2; num<=100; num++){
              sr = (int) sqrt(num);
              for(num2=2; num2 <= sr; num2++){
                  //num2 <== sr to stop the innner loop
                  if(num%num2 == 0){
                      //printf("=========== %d|%d\n", num,num2); // uncomment this to see if a number is divisable
                      isPrime = 0; // this number is not prime, cos num can be divided by num2
                      break;
                  }
              }
              if(isPrime){
                  printf("Prime number is %d\n", num);
                  isPrime = 1; // reset the check parameter
              }else{
                  isPrime = 1; // reset the check parameter
              }
          }
               return 0;
          }
      

      此代码有效。既然它有效,我会让你玩它并优化它。如果你不能让我们知道。我们会尽力帮助您。

      我喜欢你使用 sqrt 优化代码的方式。

      【讨论】:

        【解决方案4】:

        您可以使用的一种优化是 所有大于 3 的素数都是 6n+1 或 6n-1 的形式,并且如果一个数可以被一个素数整除,那么它是不是素数。以下是一些使用该事实的代码:

        #include <stdio.h>
        #include <math.h>
        
        int is_prime(long num)
        {
            int k = 1, a = 0, b = 0;
            long sr;
            switch(num)
                {
                case 1: return 0;
                case 2: return 1;
                case 3: return 1;
                case 4: return 0;
                case 5: return 1;
                case 6: return 0;
                case 7: return 1;
            }
            if (num % 2 == 0) return 0;
            if (num % 3 == 0) return 0;
            sr = (int) sqrt(num);
            while (b < sr) {
                a = (6 * k) - 1;
                b = (6 * k) + 1;
                if (num % a == 0)
                    return 0;
                if (num % b == 0)
                    return 0;
                k += 1;
            }
            return 1;
        }
        
        void main(void)
        {
            int j;
        
            for (j = 0; j<100; j++){
                if (is_prime(j))
                    printf("%d is a prime\n", j);
            }
        }
        

        如果 num 是素数,此函数返回 1。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多