质数数量题目https://ac.nowcoder.com/acm/problem/22226
这道题我第一次提交用的是普通的计算质数的做法,可是:答案都错误啊 (代码如下)
#include <bits/stdc++.h>
using namespace std;
bool sushu(int n){
for(int i=2;i<=sqrt(n);i++){
if(n%i==0){
return false;
}
}
if(n<=1) return false;
return true;
}
int n,c;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>x;
for(int j=1;j<=x;j++){
if(sushu(j)) c++;
}
cout<<c<<endl;
}
return 0;
}
我看了看题目,我觉得这题的数据范围太大了,都10^6了!!!
所以,在我的代码里加了一些修改:
首先,判断质数的函数要改那么一点点,用一个变量flag来标记这个数是否是质数,如果是质数,返回1,如果不是质数,返回0,改了的判断质数的代码:
int prime(int n){//判断是否是质数的函数
int flag=0;
if(n==1){//判断特殊情况
return 0;
}
for(int i=2;i<=sqrt(n);i++){
if(n%i==0){//不是质数的情况
flag=1;//标记为1
break;
}
}
if(flag==1){//不是质数
return 0;
}else{//是质数
return 1;
}
}
接下来就要改改主函数了!!!
首先,定义一个a数组,这个数组就是用来输出质数个数的!
然后,将a数组的一些边界写好:
a[0]=0;//从1~0的质数个数为0
a[1]=0;//从1~1的质数个数为1
写好之后,就要做一些正经的不是边界的事情了。
因为直接判断会超时,所以我们这样做:
判断:
1、如果这个数是质数,那么我们就取前面数的a数组里的值+1(因为是质数,所以指数的数量又多了一个,也就是+1)。
2、如果这个数不是质数,那么我们就取前面数的a数组里的值。
for(int i=2;i<=1000000;i++){
if(prime(i)){
a[i]=a[i-1]+1;
}else{
a[i]=a[i-1];
}
}
然后就是一些普通的输入+输出:
int t;
cin>>t;
while(t--){
int n;
cin>>n;
cout<<a[n]<<endl;
}
就是做这些修改,这道题就AC了。
贴代码:
#include <bits/stdc++.h>
using namespace std;
int a[1000010];
int prime(int n){
int flag=0;
if(n==1){
return 0;
}
for(int i=2;i<=sqrt(n);i++){
if(n%i==0){
flag=1;
break;
}
}
if(flag==1){
return 0;
}else{
return 1;
}
}
int main(){
a[0]=0;
a[1]=0;
for(int i=2;i<=1000000;i++){
if(prime(i)){
a[i]=a[i-1]+1;
}else{
a[i]=a[i-1];
}
}
int t;
cin>>t;
while(t--){
int n;
cin>>n;
cout<<a[n]<<endl;
}
return 0;
}