10 条题解
-
7
第一篇题解
好了,说正经的 审题: 1 要求输出给定范围内的素数对 2 没有,输出empty
先得知道啥是素数对 素数:除了1和本身外没有其他因数的数 例:3,5,7 素数对:俩相差2的素数 例:3 5,5 7,11 13
思路: 0 二话不说,上万能头
1 定义判断素数的函数is_prime,返回布尔值 1-0 true(1) 表示这哥们儿是素数 1-1 false(0)表示这哥们儿不是素数
2 int main()主函数 3 定义n,表示输入的数 4 重点:定义布尔值变量flag=false,用来
打酱油啊不对,是用来判断empty 5 for循环1~n 6 如果满足 i和i+2都是素数(函数返回布尔值,直接用)以及 重点:i是小于n的,i+2不一定,不加会这样n = 6,返回 3 5 5 7(无语……😕 ) 然后:WA(无语……😕 )(无语……😕 ) 评价:👎 👎 👎👎 👎 负五星差评 7 满足条件输出素数对 8 flag = true(很重要,记笔记) 问:啊,咋重要啊? 答:略 …………………不怎么华丽的分割线……………… 开个玩笑 flag= true表示有素数对!!! 9 判断flag,true还是false(有木有素数对) 有:躺平AC 木有:empty走起 WA是不可能WA的,这辈子都不可能WA的🚀️ TE是不可能TE的,这辈子都不可能TE的🚀️
(除非你眼瞎)(观众的臭骂声、肋骨的碎裂声)10 return 0;结束#include <bits/stdc++.h> using namespace std; bool is_prime(int n) { if (n < 2) return false; for (int i = 2;i <= sqrt(n);i++) { if (n % i == 0) return false; } return true; } int main() { int n; bool flag = false; cin >> n; for (int i = 1;i <= n;i++) { if (is_prime(i) && is_prime(i + 2) && i + 2 <= n) { cout << i << " " << i + 2 << endl; flag = true; } } if (flag == false) cout << "empty"; return 0; }
都看到这了,还不那个一下(👍 👍 👍 ) ——陈哲宇 2023 07 20
-
2
解析
当i和i+2都为素数时,称它们为素数对,现在要求所有的素数对。
题解
#include <iostream> using namespace std; bool isP(int x) { if (x < 2) return 0; for (int i = 2; i * i <= x; i++) if (x % i == 0) return false; return true; } int main() { int n; cin >> n; for (int i = 1; i <= n && i + 2 <= n; i++) if (isP(i) && isP(i + 2)) cout << i << " " << i + 2 << "\n"; return 0; }
-
0
#include <iostream> using namespace std; bool prime(int n) { if(n == 1) { return 0; } for(int i = 2;i < n;i++) { if(n % i == 0) { return 0; } } return 1; } int main() { int n; cin >> n; if(n < 5) { cout << "empty"; return 0; } for (int i = 3;i <= n - 2;i++) { if(prime(i)) { if(prime(i + 2)) { cout << i << " " << i + 2 << endl; } } } return 0; }
-
0
其实我都跟不上做题进度,但是我能熬夜到23点👀️ yasuo精神,压缩宝贵的睡眠时间😄
#include <iostream> bool sushu(int q){ if(q<2) return false; for(int i=2;i*i<=q;i++) if(q%i==0) return false; return true;} int main(){ int q;std::cin>>q; for(int i=2;i+2<=q;i++) if(sushu(i)&&sushu(i+2)) std::cout<<i<<" "<<i+2<<"\n"; return 0;}
-
0
#include<bits/stdc++.h> using namespace std; bool jntm(int n) { if (n<2) return false; for (int i=2;i*i<=n;i++) { if (n%i==0) return false; } return true; } int main() { int n,sum=0; cin>>n; for (int j=3;j<=n;j++) { if (jntm(j) && jntm(j+2) && j+2<=n) { cout<<j<<" "<<j+2<<endl; sum++; } } if (sum==0) cout<<"empty"; return 0; }
-
0
两个相差为2的质数称为质数对 如 5和7,17 和 19等, 本题目要求找出所有两个数均不大于 n 的质数对
由题目知,与质数(素数)有关, 所以质数筛摆上
bool prime(int n){ if (n < 2) return false; for(int i = 2;i*i <= n;i++) if(n % i == 0) return false; return true; }
易懂版本
bool prime(int n){//定义一个布偶函数 //布偶函数返回判断是否为质数 if (n < 2){//质数为只有1和自己为因数的自然数 return false;//则1,0都不算 } for(int i = 2/*大于2的数中*/;i*i <= n/*i*i和i效果一样*/;i++{ if(n % i == 0){//判断质数,有其它因数的不算 return false;//return后结束循环 } } return true;//都没有的即为质数 }
然后分析,质数对为两个质数 其中一个=另一个+2 用 i 表示,则为i,i+2均为质数 引用质数筛,则可简化为
(prime(i) && prime(i+2))
要求为输出1~n中的所有质数对 并且正整数 n(1≤n≤10^4)可以直接枚举 则编写主函数为
int main() { bool flag=1;//有没有质数 int n; cin >> n;//输入n for (int i = 3/*最小的质数对:3,5*/;i+2<=n/*i+2不越界*/;i++){ if (prime(i) && prime(i+2))/*判断质数*/{ cout << i << ' ' << i+2 << endl;//成立后输出 flag=0;//所以范围内有质数 } } if (flag){//范围内没质数 cout << "empty";//按题意输出empty } return 0; }
这里发现循环条件也可以写成这样
for (int i = 5;i<=n/*i为更大一个的数*/;i++)
则整个主函数代码可以写成
int main() { bool flag=1; int n; cin >> n; for (int i = 5/*i为更大一个的数*/;i<=n;i++){ if (prime(i) && prime(i-2)){ cout << i-2 << ' ' << i << endl; flag=0;//输出顺序改变 } } if (flag) cout << "empty"; return 0; }
所以再加上导入库
#include <iostream> using namespace std;
最终结果
#include <iostream> using namespace std; bool prime(int n){ if (n < 2) return false; for(int i = 2;i*i <= n;i++) if(n % i == 0) return false; return true;} int main(){ bool flag=1; int n; cin >> n; for (int i = 5;i<=n;i++){ if (prime(i) && prime(i-2)){ cout << i-2 << ' ' << i << endl; flag=0; } } if (flag) cout << "empty"; return 0;}
-
0
- 前言 我发现这道题竟然有人WA,甚至TE,忍不了了,直接上题解.
- 思路 由于 n 最大只到 10^4,所以我们可以直接枚举并判断。而且数据较小完全符合时间复杂度O(n*radical symbol(n))
- 代码 这里带着大家写代码
- 导入头文件(TE的是不是用了万能头)
#include <iostream> using namespace std;
- 定义一个函数,用来判断质数的取值
bool isprime(int n){ if(n==1) return false; if(n==2) return true; for(int i=2;i*i<=n;i++) if(n%i==0) return false; return true; }
用bool判断"T"or"F"
- 主代码 寻思着T就接着往下跑了
int main(){ int n,flag1=true,flag2; cin>>n; if(n<=4) {cout<<"empty";return 0;} for(int i=3;i<=n-2;i+=2){ flag2=isprime(i+2); if(flag1 && flag2 ) cout<<i<<" "<<i+2<<endl; flag1=flag2; } return 0; }
ok,成功完成,希望对你有用!
END 祝你编程愉快
-
0
思路:
根据题目可得:两个素数中的最大的那个也不大于n,所以可以写个for循环(循环变量为i)枚举两个素数种较大的那个,注意循环要从5开始,因为如果从2和3开始的话另一个数是0和1,0和1肯定不是素数
接下来做判断:如果i和i-2都是质数,输出
因为如果没有素数对需要输出empty,所以可以写一个用于统计素数对对数的变量,在最后判断一下,如果这个变量为0,输出empty
判断一个数是不是素数:
写个枚举2到 这个数 - 1的for循环,如果这里面有这个数的因数,说明这个数不是素数
#include <iostream> using namespace std; bool prime(int n) { for(int i = 2;i < n;i++) { if(n % i == 0) return false; } return true; } int main() { int n,cnt = 0; cin >> n; for(int i = 5;i <= n;i++) { if(prime(i) && prime(i - 2)) { cnt++; cout << i - 2 << ' ' << i <<endl; } } if(cnt == 0) cout << "empty"; return 0; } ``
-
-1
#include<iostream> using namespace std; bool check(int n)//判断质数 { if(n<2) { return false; } for(int i=2;i<n;i++) { if (n%i==0) { return false; } } return true; } int main() { int n; cin >> n; for(int i=0;i<=n;i++) { int a=i+2; if (a<n)//处理边界 { if(check(i) && check(a))//输出素数对 { cout << i << " " << a << endl; } } } return 0; }
-
-2
#include<iostream> using namespace std;//全网最短代码 int main() { int sushudui[69]={0,3,5,5,7,11,13,17,19,29,31,41,43,59,61,71,73,101,103,107,109,137,139,149,151,179,181,191,193,197,199,227,229,239,241,269,271,281,283,311,313,347,349,419,421,431,433,461,463,521,523,569,571,599,601,617,619,641,643,659,661,809,811,821,823,827,829,857,859,881,883},n; //定义素数对列表 cin >> n; for(int i = 1; sushudui[i+1] <= n; i += 2) cout << sushudui[i] << " " << sushudui[i + 1] << endl; return 0; }
- 1
信息
- ID
- 305
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- 递交数
- 1269
- 已通过
- 535
- 上传者