输出错误的Project Euler 7

Output wrong Project Euler 7

本文关键字:Euler Project 错误 输出      更新时间:2023-10-16

所以我正在尝试Project Euler的问题7。

通过列出前六个素数:2、3、5、7、11和13,我们可以看到第六个素数是13。第1001个素数是什么?

#include <iostream>
#include <cmath>
using namespace std;
bool isPrime(int a){
    if (a==2||a==3){
        return true;
    }
    if (a%2==0){
        return false;
    }
    bool prime=true;
    for (int b=2;b<sqrt(a);b++){
        if (a%b==0)
            prime=false;
    }
    if (prime==true)
        return true;
    else 
        return false;
}
int main(){
    int infinite=0;
    long long int primecounter=0;
    for (int c=2;infinite==0;c++){
        if (isPrime(c)==true){
            primecounter++;
            //cout<<c<<endl;
            if (primecounter==10001)
                {cout<<c;
            break;}
        }
    }
    return 0;}

这就是我到目前为止所想到的。它适用于我测试的少数几个数字,比如第6个素数等。然而,当我对第10001个素数运行它时,它给了我104021,答案是错误的。有人能告诉我我的代码出了什么问题吗?

哪里出错是b < sqrt(a)。想想a=25,在这种情况下会发生什么?

评论已经指出了答案的其余部分

尽管这不是这个特定问题所必需的,但您应该看看埃拉托斯特内斯筛算法。你迟早会需要它来解决与素数相关的问题。

您也可以在没有"cmath"帮助的情况下解决它。逻辑就像。。。要检查一个数字是否为素数,请将计数器变量设置为0;写一个循环,把这个数字除以每一个小于它的数字,直到1。如果一个数字将其完全除,计数器将增加一;对于素数,counetr将恰好为2。要计算这么大的数字,你也应该选择一个合适的数据类型。我使用了"long-long-int"作为数据类型。我对项目euler问题7的代码如下。希望它能帮助你。致以最良好的祝愿。欢迎对该程序进行修改和改进。唯一的缺陷是它消耗的时间,达到第10001个素数需要一个多小时。

        #include<iostream.h>
        #include<conio.h>
          class prime
             {
              long long int a;
              long long int j,i;
               public:
             void display();
              };
        void prime::display()
             {
                  j=0;
                 long long int count=0;
                 long long int count1=0;
               while(count1!=10001)
                 {
                     j=j+1;
                     i=j;
                     while(i!=0)
                   {
                       if(j%i==0)
                          {
                            count++;
                           }
                       i--;
                    }
                     if(count==2)
                        {
                           count1++;
                           cout<<count1<<"t";  //The serial number of the prime number.
                           cout<<j<<"t";// This will diaply all prime numbers till 10001.
                         }
                   if(count1==10001)
                        {
                          cout<<"nThe 10001th prime number is:"<<j;
                         }
                      count=0;
                  }
               }
                     void main()
                         {
                              prime k;
                              clrscr();                                 
                              k.display();
                              getch();
                          }