一、题目描述
给定一个整数m(50<m<20000),找出小于m的最大的10个素数。
输入格式:
输入在一行中给出一个正整数m(50<m<20000)。
输出格式:
在一行中按递减顺序输出10个满足条件的素数,每个素数输出占6列。没有其它任何附加格式和字符。
输入样例:
229
输出样例:
227 223 211 199 197 193 191 181 179 173
代码长度限制
1000 KB
时间限制
400 ms
内存限制
64 MB
二、算法思路
1、先大概写个框架
首先写个main函数大致框架,再填充具有判断是否为素数的isPrime函数部分
bool isPime(int)//写个isPrime函数声明
int main(){
int m;
cin>>m;
m--;//要求的是列出比m小的素数,不包括m自身,先将m自减1
int count=0;//要求从大到小列出10个素数,所以要有一个count计数功能
while(count<10){
if(isPrime(m)){如果是素数
cout<<setw(6)<<m;//set(w)是占位符,保证一个数占六位
count++;
}
m--;//在while循环中m自减,保证输出的素数顺序是从大到小的
}
2、填充isPrime函数
m若有大于sqrt(m)的可整除因子p,那么必定有小于sqrt(m)的另一个因子q,为避免重复计算,将for循环i的上限优化为i*i<=m。
!!!一定是<=m而不是<m否则将会漏掉如64,81这种非素数
bool isPrime(int m){
//m若有大于sqrt的可整除因子p,那么必定有小于sqrt(m)的另一个因子,为避免重复计算,将for循环i的上限优化为i*i<=m。!!!一定是<=m而不是<m否则将会漏掉如64,81这种非素数
for(int i=2;i*i<=m;i++){对于while循环中的每一个m,都依次判断是否为素数
if(m%i==0){
return false;//如果m能整除任意从2到sqrt(m)的数,那么m不是素数
}
}
return true;
}
三、完整C++代码实现
#include<iostream>
#include<iomanip>
using namespace std;
//package vs namespace IDEA(java)中的包相当于VSCode(C++)中的namespace
//import vs #include IDEA(java)中的import相当于VSCode中的namespace
bool isPrime(int);
int main(){
int m;
cin>>m;
m--;
int count=0;
while(count<10){
if(isPrime(m)){
cout<<setw(6)<<m;
count++;
}
m--;
}
}
bool isPrime(int m){
for(int i=2;i*i<=m;i++){
if(m%i==0){
return false;
}
}
return true;
}