zoukankan      html  css  js  c++  java
  • 9.1练习题5 差k素数对 题解

    题目出处:洛谷 P1348 ,题面略有改编。

    题目描述

    给你两个数 n 和 k ,请求出所有小于等于 n 的相差为 k 的素数对。

    输入格式

    两个正整数n,k。1<=k<=n<=10000。

    输出格式

    所有小于等于n的素数对。每对素数对输出一行,中间用单个空格隔开。若没有找到任何素数对,输出empty。

    样例输入

    6924 809
    

    样例输出

    2 811
    

    题目分析

    这道题目就是“素数判断”+“枚举”。
    可以用判断素数的方法进行求解。
    实现代码如下:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 10010;
    int k, n;
    bool is_prime(int a) {
        if (a < 2) return false;
        for (int i = 2; i * i <= a; i ++)
            if (a % i == 0)
                return false;
        return true;
    }
    int main() {
        cin >> n >> k;
        bool flag = false;  // flag用于标记有没有找到
        for (int i = 2; i+k <= n; i ++) {
            if (is_prime(i) && is_prime(i+k)) {
                flag = true;
                cout << i << " " << i+k << endl;
            }
        }
        if (!flag)  // 如果flag为false,说明没找到
            puts("empty");
        return 0;
    }
    

    也可以用素数筛法进行求解,实现代码如下:

    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 10010;
    int k, n;
    bool isp[maxn];
    int main() {
        cin >> n >> k;
        bool flag = false;
        fill(isp+2, isp+n+1, true);
        for (int i = 2; i <= n; i ++) {
            if (isp[i]) {
                for (int j = i*i; j <= n; j += i)
                    isp[j] = false;
            }
        }
        for (int i = 2; i+k <= n; i ++) {
            if (isp[i] && isp[i+k]) {
                flag = true;
                cout << i << " " << i+k << endl;
            }
        }
        if (!flag) puts("empty");
        return 0;
    }
    
  • 相关阅读:
    整数子数组求最大和
    四则运算实现
    四则运算
    2015年大二下学期读书计划
    java变量和数据类型
    jdk的安装和java的入门概念
    数据库的设计
    多表查询
    数据约束和外键
    表数据的简单查询语句
  • 原文地址:https://www.cnblogs.com/zifeiynoip/p/11483003.html
Copyright © 2011-2022 走看看