卡在调试一个简单的问题上。(uva 10539 几乎素数)

问题描述 投票:0回答:1

问题陈述:找出 low 和 high 之间的所有几乎素数。近素数是只能除以一个素数(等于素数的幂)的合数。

解决方案:首先创建一个素数列表,并将几乎素数存储在向量中。然后,找到向量中 low 和 high 的相对位置,并减去它们的位置即可得到答案。

别人的正确答案代码(可以在线评判得到AC):

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>

using namespace std;

const long long MAX = 1e12;
vector<long long> almostPrimes;
vector<bool> isPrime(1000000, true);

void generatePrimes() {
    isPrime[0] = isPrime[1] = false;
    for (long long i = 2; i * i < isPrime.size(); ++i) {
        if (isPrime[i]) {
            for (long long j = i * i; j < isPrime.size(); j += i) {
                isPrime[j] = false;
            }
        }
    }
}

void generateAlmostPrimes() {
    generatePrimes();
    for (long long i = 2; i < isPrime.size(); ++i) {
        if (isPrime[i]) {
            long long power = i * i;
            while (power <= MAX) {
                almostPrimes.push_back(power);
                if (MAX / i < power) break; 
                power *= i;
            }
        }
    }
    sort(almostPrimes.begin(), almostPrimes.end());
}

int main() {
    generateAlmostPrimes();
    
    int N;
    cin >> N;
    while (N--) {
        long long low, high;
        cin >> low >> high;
        
        int count = upper_bound(almostPrimes.begin(), almostPrimes.end(), high) -
                    lower_bound(almostPrimes.begin(), almostPrimes.end(), low);
                    
        cout << count << endl;
    }
    return 0;
}

明白问题后,我自己再写一遍。但它没有产生正确的答案。 错误一定发生在素数和几乎素数列表中,但我和 gpt 无法弄清楚。

当我进入 56296360 76070591 它只打印出来 0 意味着这两个数之间不存在素数或几乎素数。 我的代码:

#include <iostream>
#include <vector> 
#include <algorithm>
using namespace std;

int main(){
    vector<long long> ap,p(1000000,1);
    p[0]=p[1]=0;
// Generate a list of prime numbers
    for(long long i=3;i<1000000;i++){
        if(i%2==0)  p[i]=0.
        else if(p[i]){
            for(long long j=i*i;j<1000000;j+=i*2){
                p[j]=0;
            }
        }
    }
// almost prime numbers
    for(long long i=2;i<1000000;i++){
        if(p[i]){
            for(long long j=i*i;j<1000000*2;j*=i){
                ap.push_back(j);                
                if (j > 1e12 / i) break;
            }
        }
    }
    sort(ap.begin(),ap.end());

//The code below is the same as the correct code.
    int n;
    cin>>n;
    while(n--){
        long long l,h;
        cin>>l>>h;
        
        long long count = upper_bound(ap.begin(), ap.end(), h) -
                    lower_bound(ap.begin(), ap.end(), l);
                cout << count << endl;
// error detecting
//        for(long long i=l;i<=h;i++){
//          cout<<i<<" "<<p[i]<<endl;
//      }
//      for(auto i=lower_bound(ap.begin(), ap.end(), l);i!=upper_bound(ap.begin(), ap.end(), h);i++)
//          cout<<*i<<endl;
    }
    return 0;
}

(我希望我的英语不会造成任何误解。如果有人能帮助我,我将非常感激)

c++ debugging
1个回答
0
投票

我刚刚开始编码,但我想询问有关您的代码的更多问题。

  1. 你确定你的代码可以编译你给它的数字(位整数限制)

  2. 你输入这么大的数字可能会导致无法遍历和检查这些数字

© www.soinside.com 2019 - 2024. All rights reserved.