直入主题 今天习题来自 啊哈添柴oj
首先告知 以下三题 都与质数有关
第一题
第一题入门题
看到算质数 可以想到用到循环 因为不知道结束条件 那么就可以设置一个没有限制条件的for循环 然后最后把他给break啦
然后就是质数的判断了 作为蓝桥杯常考点 一定要非常清楚哦
直接上代码
#include <bits/stdc++.h>
using namespace std;
int main(){
int n,i,j,k,t=0;
cin>>n;
for(i=2;;i++){
k=0;
for(j=2;j*j<=i;j++){
if(i%j==0)
{
k++;
break;
}
}
if(k==0)t++;
if(t==n){
cout<<i<<endl;
break;
}
}
return 0;
}
第二题
题目看似变得有了一点点复杂的样子
那么这里的关键其实就是一个思维的转换
我一开始拿到手,我想的是枚举两个数即a b,然后去判断是否a+b=n (n是输入值),那么如果继续想下去会陷入一个思维的障碍中去,如何才能枚举两个数?所以机智的我想到了 其实b可以用n-a获得 然后再判断b是不是质数不就好了吗。
在这里我们把个数用cnt来逐个递增计算即可。
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int b,k,l,cnt=0;
for(int a=2;a<=n/2;a++){
k=0;
for(int i=2;i*i<=a;i++){
if(a%i==0){
k++;
break;
}
}
if(k==0) {
b=n-a;
l=0;
for(k=2;k*k<=b;k++){
if(b%k==0){
l++;
break;
}
}
if(l==0)
cnt++;
}
}
cout<<cnt;
return 0;
}
第三题
第三题最为最后一题,还是有那么一丢丢别致的啦,别致在哪里呢,那就是在于,如果要写出每一个具体组合的话,按照前两种的套路似乎是行不通的,那么这道题我们想到用一个更简单的方法,定义一个is_prime函数来判断他是否为质数,配合上布尔变量,简直美妙。
#include <bits/stdc++.h>
using namespace std;
bool is_prime(int n){
if(n==0||n==1)
return 0;
for(int i=2;i*i<=n;i++)
if(n%i==0)
return 0;
return 1;
}
int main()
{
int a,n;
cin>>n;
for(a=2;a<=n/2;a++)
if(is_prime(a)&&is_prime(n-a))
cout<<a<<"+"<<n-a<<endl;
return 0;
}