B1013 数素数 (20分)

2020-02-10  本文已影响0人  km15

/*
题意::
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;
}
上一篇 下一篇

猜你喜欢

热点阅读