如何找到所有素数低于200万的总和?项目欧拉第10个问题,http://projecteuler.net/problem=10。 我测试了我的代码低于10,并像一个魅力。但是低于200万似乎不起作用:/它已经持续了大约15分钟,我认为它不应该花那么长时间,对吗?我会尝试sum函数,但我仍然不明白为什么这不起作用?
编辑:我想我不能使用sum函数,因为数字甚至没有存储在数组中:/
我的代码:
#include <iostream>
using namespace std;
int main()
{
unsigned long long x,y,z=0,s[200000],a,sum=0;
bool isprime;
for(x=3;x<2000000;x++)
{
for(y=2;y<x;y++)
{
if(x%y!=0 && x!=y)
{
isprime =true;
}
else
{
isprime =false;
break;
}
}
if(isprime ==true)
{
s[z] = x;
z++;
isprime = false;
}
}
cout<<z;
for(a=0;a<z;a++)
{
sum=sum+s[a];
cout<<"Sum is being calculated "<<sum<<"\n";
}
cout<<"The sum is "<<sum+2<<" LADIES";
}
答案 0 :(得分:3)
你的问题是你的程序会检查太多不必要的除数。
为了检查给定的整数是否为素数,您需要检查它没有小于或等于其平方根的除数。因为,如果有一个大于平方根的除数,则商将是一个整数,并且小于平方根。
#include <iostream>
using namespace std;
int main()
{
unsigned long long x,y,z=0,s[200000],a,sum=0;
bool isprime;
for(x=3;x<2000000;x++)
{
for(y=2; y*y <= x ;y++)
{
if(x%y!=0 && x!=y)
{
isprime =true;
}
else
{
isprime =false;
break;
}
}
if(isprime ==true)
{
s[z] = x;
z++;
isprime = false;
}
}
cout<<z;
for(a=0;a<z;a++)
{
sum=sum+s[a];
cout<<"Sum is being calculated "<<sum<<"\n";
}
cout<<"The sum is "<<sum+2<<" LADIES";
您可以改用矢量:
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
unsigned long long x,y;
std::vector<unsigned long long> primes;
bool isprime = true;
for(x=3; x<2000000; x++)
{
isprime = true;
for(y=2; y*y <= x ;y++)
{
if(x%y==0 || x==y)
{
isprime=false;
break;
}
}
if(isprime)
{
primes.push_back(x);
}
}
unsigned long long sum = 2 + std::accumulate(v.begin(), v.end());
cout<<"The sum is "<<sum<<" LADIES";
}
答案 1 :(得分:3)
如果使用筛子,这很简单快捷:
function sumPrimes(n)
sum := 0
sieve := makeArray(2..n, True)
for p from 2 to n step 1
if sieve[p]
sum := sum + p
for i from p * p to n step p
sieve[i] := False
return sum
只需要一两秒钟即可运行。
答案 2 :(得分:0)
当试图总结和包括&#39; n&#39;我提出了以下解决方案。我希望你觉得很容易理解:
function sumPrimes(num) {
// determine if a number is prime
function isPrime(n) {
if (n === 2) return true;
if (n === 3) return true;
if (n % 2 === 0) return false;
if (n % 3 === 0) return false;
var i = 5;
var w = 2;
while (i * i <= n) {
if (n % i === 0) {
return false;
}
i += w;
w = 6 - w;
}
return true;
}
// subtract 1 for 'not being prime' in my context
var sum = isPrime(num) ? num - 1 : -1;
for (var x = 0; x < num; x++) {
if (isPrime(x) === true) {
sum += x;
}
}
return sum;
}
答案 3 :(得分:-1)
使用千里马,我可以生成所有提升到权力的素数 这是一个示例:
factor(product(i,i,2000000,2001000));
2^1005*3^499*5^255*7^169*11^101*13^83*17^61*19^54*23^46*29^36,,,,,2000939*2000941*2000953*2000959*2000963*2000969*2000989
然后我尝试抽象激进并将它们加在一起。 我认为如果你足够耐心可能会有用。这需要很长时间!!!