素数总和低于200万

时间:2017-04-01 12:04:44

标签: c

我在这里做错了什么?

  #include<stdio.h>

    int main(){
        int i,count;
        long long int sum = 0, num;

        for(num = 1; num <= 1000; num++){
            count = 0;
            for(i = 2; i <= num / 2; i++){
                if(num % i == 0){
                    count++;
                    break;
                }
            }
            if(count == 0 && num != 1)
                sum = sum + num;
        }
        printf("Sum of prime numbers is: %d ", sum);
        return 0;
    }

我试图制作一个程序,输出低于第n个数字的所有素数之和,n为2百万,但是当我尝试运行它时,有一点延迟并且它没有输出......它对小的工作得很好数字,如1000或100,但大数字,它只是没有输出任何东西。我也不知道任何错误或错误。 (请帮助,我什么都不知道,所以引导这个年轻人)

2 个答案:

答案 0 :(得分:1)

上述程序很好,但可以进一步降低时间复杂度并使其更快。
更好的方法是使用筛选eratosthenes 算法。
你可以在这里阅读http://www.geeksforgeeks.org/sieve-of-eratosthenes/

您的问题的程序是

#include <bits/stdc++.h>
using namespace std;

void SieveOfEratosthenes(long long int n)
{

    bool prime[n+1];
    memset(prime, true, sizeof(prime));

    for (long long int p=2; p*p<=n; p++)
    {
        if (prime[p] == true)
        {
                 for (int i=p*2; i<=n; i += p)
                prime[i] = false;
        }
    }

 long long sum=0;
        for (int p=2; p<=n; p++)
       if (prime[p])
          sum+=p;
          cout << sum << " ";
}


int main()
{
    int n = 2000000;
    cout << "sum of prime numbers less then 2000000 is :" << endl;
    SieveOfEratosthenes(n);
    return 0;
}

如果您在理解程序时遇到困难,请告诉我。

注意:您还可以使用细分的来进一步减少时间复杂度

答案 1 :(得分:0)

#include<stdio.h>
#include<math.h>
int main(){
int i,count;
long long int sum=0, num;
for(num = 1;num<=1000000;num++){
 count = 0;
for(i=2;i<=sqrt(num);i++){         //change here
if(num%i==0){
 count++;
 break;
  }
  }
     if(count==0 && num!= 1)
      sum = sum + num;
      }
  printf("Sum of prime numbers is: %lld ",sum);   //and here
     return 0;
    }

一些简单的数学,在检查素数时,检查数字的平方根。在printf()中,long long int的格式说明符是%lld而不是%d。