/*
题意::
1、给出两个数(小于10的4次方),给出两个数之间的所有数字(两个数代表的是第几个素数
输出要求,10个数字1行,其间空格,但是末尾不要空格
解题:
1、直接得出10的4次方以内的素数表
2、然后枚举从N到M的素数
3、一个计数count,是素数+1,每十个输出一个换行
4、并且count小于10,也输出空格
learn && wrong:
1、运行窗口没关闭就再次编译也会这样,id blabla错误
2、如果空格没法看清楚,可以换个符号,感叹号之类的
3、用筛法或非晒法都行,但是加一个if(num >= n) break;更好
4、下标从0开始,所有左端点应该是-1,而且题目说从N~M,所有右端点是闭的
5、最重要是这个,count++余上10不等于0并且i < n,输出空格,不然输出换行符
这一部实现了每十个一换行,10个以内有空格!
6、重置count为0有个过不了,标准答案就全过了
*/
#include <iostream>
#include <cmath>
using namespace std;
const int maxn = 100100;
//判断是否素数
bool isprime(int n){
if(n <= 1) return false;
int sqr = (int)sqrt(1.0 * n);
for(int i = 2;i <= sqr;i++){
if(n % i == 0) return false;
}
return true;
}
//素数表
int prime[maxn],num = 0;
bool p[maxn] = {0};
void find_prime(int n){
for(int i = 2;i <= maxn;++i){
if(isprime(i) == true){
prime[num++] = i;
p[i] = true;
if(num >= n)
break;//!!!
}
}
}
int main(int argc, char** argv) {
int N,M;
cin>>N>>M;
find_prime(M);// 生成素数表
int count = 0; //计数的,判断输出空格还是换行
for(int i = N;i <= M;++i){ //!!!要求输出第几个,直接从prime计算就可以了啊~!我服了 !!!从0开始,记得减1
cout<<prime[i - 1]; //还有,输出N~M之间的素数,其实也好办呀,也是遍历,然后prime[i]>n && prime[i]<M就行了
count++;
if(count % 10 != 0 && i < M) cout<<" ";
else if(count == 10) { //!!!这个会有一个过不了,原因不知道,标准答案全对
cout<<endl;
count = 0;
}
}
return 0;
}
网友评论