问题陈述:找出 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;
}
(我希望我的英语不会造成任何误解。如果有人能帮助我,我将非常感激)
我刚刚开始编码,但我想询问有关您的代码的更多问题。
你确定你的代码可以编译你给它的数字(位整数限制)
你输入这么大的数字可能会导致无法遍历和检查这些数字