c++6级题之筛选法求质数

第1题     质数个数-一般做法(程序填空)

时限:1s     空间:256m    

题目描述

输入n,输出1~n以内的质数的个数。(n<=1000) 

挖空的代码

#include<bits/stdc++.h>

using namespace std;

int main()

{

int n,s=0;

cin>>n;

for(int i=2;i<=n;i++) //质数是从2开始算

{

int flag=1; //标记默认1,表示是质数

for(int j=2;j*j<=i;j++)

if(

1

) //如果有因子

flag=0; //标记变成0

if(flag) //标记没有变成0,表示没有其他因子

                    s++; //表示是质数,质数数量增加1

}

cout<<s;

return 0;

}

输入格式

输出格式

输入/输出例子1

输入:

10

输出:

4

标签

暂未设置关联标签

知识点

暂未设置关联知识点

题解

第1空

i%j==0

第2题     质数个数-自定义函数(程序填空)

时限:1s     空间:256m    

题目描述

输入n,输出1~n以内的质数的个数。(n<=1000) 

挖空的代码

#include<bits/stdc++.h>

using namespace std;

bool zs(int x) //判断是否质数的函数

{

for(int i=2;i*i<=x;i++)

if(

1

)

return false; //如果有因子,就不是质数

return true;

}

int main()

{

int n,s=0;

cin>>n;

for(int i=2;i<=n;i++)

if(

2

)s++;

cout<<s;

return 0;

}

输入格式

输出格式

输入/输出例子1

输入:

10

输出:

4

标签

暂未设置关联标签

知识点

暂未设置关联知识点

题解

第1空x%i==0
第2空zs(i)==1

第3题     质数个数-筛选法(程序填空)

时限:1s     空间:256m    

题目描述

输入n,输出1~n以内的质数的个数。(n<=1000) 

挖空的代码

#include<bits/stdc++.h>

using namespace std;

bool a[1002]; //数组数值为零,默认都是素数 

int main()

{

    int n,s=0;

    cin>>n;

    for(int i=2;i<=1000;i++)

    {

        if(

1

)//如果是素数

            for(int j=i+i;j<=1000;

2

) //将他的倍数记为合数

                a[j]=i; //标记不为零,表示不是素数

    }

    for(int i=2;i<=n;i++)

        if(a[i]==0) //如果是素数

            s++;

    cout<<s;

    return 0;

}

输入格式

输出格式

输入/输出例子1

输入:

10

输出:

4

标签

暂未设置关联标签

知识点

暂未设置关联知识点

题解

第1空a[i]==0
第2空j+=i

第4题     质数个数-筛选法优化(程序填空)

时限:1s     空间:256m    

题目描述

输入n,输出1~n以内的质数的个数。(n<=1000) 

挖空的代码

#include<bits/stdc++.h>

using namespace std;

bool a[1002]; 

int main()

{

int n,s=0;

cin>>n;

for(int i=2;

1

;i++) // 去除不必要的计算

{

if(a[i]==0)

for(int j=i+i;j<=1000;j+=i) 

a[j]=i;  

}

for(int i=2;i<=n;i++)

if(a[i]==0) 

s++;

cout<<s;

return 0;

}

输入格式

输出格式

输入/输出例子1

输入:

10

输出:

4

标签

暂未设置关联标签

知识点

暂未设置关联知识点

题解

第1空i<=n

第5题     数学问题(noip2007mn)(程序填空)

时限:1s     空间:256m    

题目描述

在一个渺无人烟的荒岛上待了XX年之后,小z基本上啥都不会了。所以,当小y告诉他任何一个大于等于4的偶数都能表示成两个质数的和这个事实的时候,小z根本不相信!小z现在想找出一些反例,你能帮助他吗?

挖空的代码

#include using namespace std; int n,x,k[1000005]; int date() { for(int i=2;i<=1000000;i++) //做素数表 k[i]=1; for(int i=2;i<=1000;i++) for(int j=i+i;j<=1000000;j+=i) k[j]=0; } int main() { date(); cin>>n; for(int i=1;i<=n;i++) { cin>>x; int flag=1; for(int j=2;j+j<=x;j++) //x的后一半已经在前一半那时试过,不用重复 if( $#_%$ && $#_%$) //两个加数都是质数,就输出 { cout<

输入格式

输入文件第一行为一个整数n(1<=n<=50) 
接下来有n行,每行包含一个整数m。(3<=m<=1000000) 

输出格式

输出文件共n行,每行对应于每一个m,如果m不能表示成两个质数的和,则输出“NO WAY!”;否则输出一种方案。如果有多种可行方案,输出两个质数的差最大的那一种。

输入/输出例子1

输入:

2

10

11

输出:

10=3+7

NO WAY!

标签

暂未设置关联标签

知识点

暂未设置关联知识点

题解

第1空k[j]==1
第2空k[x-j]==1

第6题     阶乘因子(yinzi) 查看测评数据信息

桐桐刚刚学习了自然数N的阶乘(N!):被定义成从1到N的所有整数的乘积。例如5!=5*4*3*2*1=120,随着数N的增大,N!增长的非常快,5!=120,10!=3628800。桐桐想到了一种方法来列举那么大的数:不是直接列出该数,而是按照顺序列举出该数中各个质数因子出现的次数,如825可描述为(0 1 2 0 1),意思是对825分解质因数,这些质数因子中有0个2,1个3,2个5,0个7,1个11。请你编一个程序,读入N值,帮助桐桐按顺序输出N!所包含的质数因子的个数。

输入格式

只包含1个数N(2<=N<=100000)

输出格式

一个N!中所包含的质数因子的个数(从最小的质数开始)的序列,数与数之间用一个空格隔开。

输入/输出例子1

输入:

53

输出:

49 23 12 8 4 4 3 2 2 1 1 1 1 1 1 1

样例解释

题解

#include<bits/stdc++.h>
using namespace std;
int n,a[1000005],s,t[1000005];
const int N=1e5+5;
bool A[N];
int main(){
    cin>>n;
    for(int i=2;i<=sqrt(n);i++){ 
           if(A[i]==0)
               for(int j=i+i;j<=n;j+=i)
                   A[j]=1;
    }
    for(int i=2;i<=n;i++){
        if(A[i]==0)t[++s]=i;
    }
    for(int i=2;i<=n;i++){
        if(A[i]==0)a[i]++;
        else{
            int p=i;
            for(int j=1;j<=s;j++){
                while(p%t[j]==0){
                    p=p/t[j];
                    a[t[j]]++;
                }
                if(p==1)break;
            }
        }
    }
    for(int i=1;i<=s;i++){
        cout<<a[t[i]]<<" ";
    }
    return 0;
}

第7题     统计素数(pcount) 查看测评数据信息

桐桐想统计某个区间范围里的素数,例如,A=2,B=10,则A和B之间(包括A、B)素数一共有4个,分别为:2,3,5,7。现在桐桐给出N个区间范围,问每个区间有多少个素数。请你帮助她统计一下。

输入格式

第一行一个整数 N(1<=N<=10^5);
后有N行,每行两个整数A B(1<=A<=B<=10^6),用空格隔开,表示一个区间范围。

输出格式

共N行,每行一个整数,对应区间范围的素数个数。

输入/输出例子1

输入:

2
2 8
1 13

输出:

4

6

样例解释

题解

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
long long a[N],x,y,sum,n;
bool ss(long long cs){
    long long b,s=0;
    if(cs<=1){
        return 0;
    }
    for(int i=2;i*i<=cs;i++){
        if(cs%i==0){
            return 0;
        }
    }
    return 1;
}
void f(){
    for(int i=1;i<=1e6;i++){
        long long ans=0;
        if(ss(i)) ans++;            
        a[i]=a[i-1]+ans;
    }
}
int main(){
    f();
    cin>>n;
    for(int i=1;i<=n;i++){
        scanf("%d %d",&x,&y);
        printf("%d\n",a[y]-a[x-1]);
    }
    return 0;
}

第8题     单纯质因数(pprim)(nhoi2014小学甲组) 查看测评数据信息

读五年级的楠楠刚学完了质数、合数、因数、质因数等概念。 
他还知道了每个合数都可以写成几个质数相乘的形式,其中每个质数都是这个合数的因数,叫做这个合数的质因数.把一个合数用质因数相乘的形式表示出来,叫做分解质因数. 
聪明爱动脑筋的楠楠突然对具有互不相同的质因数的合数产生了兴趣。例如:30=2*3*5,它有互不相同的质因数;70=2*5*7,它也有互不相同的质因数。若一个合数中所有的质因数互不相同,则把它称之为具有单纯质因数的合数。他想知道还有哪些数是单纯质因数的合数。 
你现在要帮楠楠解决的问题是:已知N,依次输出N以内所有具有单纯质因数的合数。 

输入格式

输入数据只一个整数N(10<=N<=100000)。

输出格式

依次输出N以内所有具有单纯质因数的合数。

输入/输出例子1

输入:

12

输出:

6 10

样例解释

题解

#include<bits/stdc++.h>
using namespace std;
int n,a[1000005],s,t[1000005],y,x;
const int N=1e5+5;
bool A[N];
int main(){
    cin>>n;
    for(int i=2;i<=sqrt(n);i++){ 
           if(A[i]==0)
               for(int j=i+i;j<=n;j+=i)
                   A[j]=1;
    }
    for(int i=2;i<=n;i++){
        if(A[i]==0)t[++s]=i;
    }
    for(int i=2;i<=n;i++){
        if(A[i]==0){
            
        }
        else{
            int p=i,l=1;
            for(int j=1;j<=s;j++){
                y=0;
                while(p%t[j]==0){
                    p=p/t[j];
                    y++;
                    if(y>1){
                        l=0;
                        break;
                    }
                }
                if(p==1)break;
                if(l==0)break;
            }
            if(l==1){
                cout<<i<<" ";
            }
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值