1013 数素数 C++题解


在这里插入图片描述

输入样例:

5 27

输出样例:

11 13 17 19 23 29 31 37 41 43
47 53 59 61 67 71 73 79 83 89
97 101 103


我的思路及代码

#思路:
设定一个is_primes函数判定是否是素数,从0到1e6找素数,如果是素数就cnt++,不是就跳过,同时得处理输出格式,如果cnt是m到n内的(也就是第m到第n个素数)那么就输出他们,并且每输出10个就换行 注意最后输出的第n个素数后面不要带\n换行 直接输出就行

#代码:

#include <bits/stdc++.h>
using namespace std;
int m, n;

bool is_primes(int x)
{
    if (x < 2) return false;
    for (int i = 2; i <= x / i; i ++ )
        if (x % i == 0) return false;
    return true;
}

int main()
{
    cin >> m >> n;
    int cnt = 0;
    int num = 0;
    for (int i = 0; i < 1e6; i ++ )
    {
        if (is_primes(i)) cnt ++; //是素数就++
        else continue; //不是就跳过
        if (cnt >= m && cnt < n) //需要是第m到第n-1个素数
        {    
            num ++;
            if (num < 10) cout << i << " ";
            else 
            {
                cout << i << endl;
                num = 0;
            }
        }
        if (cnt == n) cout << i; //特殊处理第n个素数
    }
    return 0;
}

柳神的思路及代码

#思路:
vector中保存第M到第N个素数,⽤cnt标记输出了多少个,如果当前已经输出的个数为10的倍数,则输出⼀个空⾏~

#代码:

#include <iostream>
#include <vector>
using namespace std;

bool isprime(int a) {
    for (int i = 2; i * i <= a; i++)
        if (a % i == 0) return false;
    return true;
}

int main() {
    int M, N, num = 2, cnt = 0;
    cin >> M >> N;
    vector<int> v;

    while (cnt < N) {
        if (isprime(num)) {
            cnt++;
            if (cnt >= M) v.push_back(num);
        }
        num++;
    }

    cnt = 0;
    for (int i = 0; i < v.size(); i++) {
        cnt++;
        if (cnt % 10 != 1) printf(" ");
        printf("%d", v[i]);
        if (cnt % 10 == 0) printf("\n");
    }
    return 0;
}

和我的代码对比 很巧妙的处理后面的输出格式问题

    cnt = 0;
    for (int i = 0; i < v.size(); i++) {
        cnt++;
        if (cnt % 10 != 1) printf(" ");
        printf("%d", v[i]);
        if (cnt % 10 == 0) printf("\n");
    }

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值