求100之内的素数-多语言

发布于:2024-12-07 ⋅ 阅读:(31) ⋅ 点赞:(0)

目录

C 语言实现

方法 1: 使用 for 循环

方法 2: 使用埃拉托斯特尼筛法

方法 3: 使用自定义判断素数 

Python 实现

方法 1: 使用自定义函数判断素数

 方法 2: 使用埃拉托斯特尼筛法(Sieve of Eratosthenes)

方法 3: 使用递归方法

Java 实现

方法 1: 使用自定义函数判断素数

方法 2:使用埃拉托斯特尼筛法(Sieve of Eratosthenes)

 方法 3:递归方法

方法 4: 使用 Java 8 的流(Streams)

Js 实现 

方法 1: 使用自定义函数判断素数

方法 2:埃拉托斯特尼筛法(Sieve of Eratosthenes)


题目:求100之内的素数。

程序分析:质数(prime number)又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除。

C 语言实现

方法 1: 使用 for 循环

#include <stdio.h>
#include <math.h>

int main() {
    int i, j, k, n = 0; // 定义变量
    for (i = 2; i <= 100; i++) { // 遍历从 2 到 100 的每个整数
        k = (int)sqrt(i); // 计算 i 的平方根
        for (j = 2; j <= k; j++) // 检查 i 是否能被 2 到 k 之间的任何数整除
            if (i % j == 0) break; // 如果能整除,说明 i 不是素数,跳出内层循环
        if (j > k) { // 如果 j 超过 k,说明 i 是素数
            printf("%d ", i); // 打印素数
            n++; // 素数计数器加一
            if (n % 5 == 0) // 每打印 5 个素数换行
                printf("\n");
        }
    }
    return 0; // 程序结束
}
  • 该程序使用了简单的算法来检查每个数字是否为素数。
  • 它通过检查从 2 到该数字平方根的所有整数来判断一个数是否为素数。
  • 每找到 5 个素数就换行,以便输出格式更整齐。

方法 2: 使用埃拉托斯特尼筛法

  1. 使用更高效的素数检测算法:对于较大的范围,可以考虑使用埃拉托斯特尼筛法(Sieve of Eratosthenes)来生成素数,这样效率更高。
  2. 代码可读性:可以增加注释,或者将部分逻辑封装成函数,以提高代码的可读性和可维护性。
  3. 输出格式:可以在输出的最后添加换行符,以使输出更整洁。
#include <stdio.h>
#include <stdbool.h>

#define MAX 100

int main() {
    bool isPrime[MAX + 1]; // 创建一个布尔数组来标记素数
    for (int i = 0; i <= MAX; i++) {
        isPrime[i] = true; // 初始化所有数为素数
    }
    
    isPrime[0] = isPrime[1] = false; // 0 和 1 不是素数

    for (int i = 2; i * i <= MAX; i++) {
        if (isPrime[i]) {
            for (int j = i * i; j <= MAX; j += i) {
                isPrime[j] = false; // 标记 i 的倍数为非素数
            }
        }
    }

    int count = 0;
    for (int i = 2; i <= MAX; i++) {
        if (isPrime[i]) {
            printf("%d ", i);
            count++;
            if (count % 5 == 0) {
                printf("\n"); // 每打印 5 个素数换行
            }
        }
    }
    printf("\n"); // 最后换行
    return 0;
}
  • 这个改进后的版本使用了布尔数组 isPrime 来标记每个数字是否为素数。
  • 通过筛法,所有非素数的标记都被设置为 false,最终只输出标记为 true 的数字。
  • 这种方法在处理较大范围的素数时效率更高。

方法 3: 使用自定义判断素数 

#include <stdio.h>
#include <math.h>

int isPrime(int num) {
    if (num < 2) return 0; // 0 和 1 不是素数
    if (num == 2) return 1; // 2 是素数
    if (num % 2 == 0) return 0; // 排除偶数

    for (int j = 3; j <= sqrt(num); j += 2) { // 只检查奇数
        if (num % j == 0) return 0; // 如果能被整除,返回 0
    }
    return 1; // 是素数
}

int main() {
    int n = 0; // 素数计数器
    for (int i = 2; i <= 100; i++) {
        if (isPrime(i)) {
            printf("%d ", i);
            n++;
            if (n % 5 == 0) {
                printf("\n"); // 每打印 5 个素数换行
            }
        }
    }
    printf("\n"); // 最后换行
    return 0;
}

Python 实现

方法 1: 使用自定义函数判断素数

这个 Python 程序将打印 2 到 100 之间的所有素数

import math

def is_prime(num):
    if num < 2:
        return False
    for j in range(2, int(math.sqrt(num)) + 1):
        if num % j == 0:
            return False
    return True

def main():
    n = 0  # 素数计数器
    for i in range(2, 101):  # 遍历从 2 到 100 的每个整数
        if is_prime(i):  # 检查 i 是否为素数
            print(i, end=' ')  # 打印素数
            n += 1  # 素数计数器加一
            if n % 5 == 0:  # 每打印 5 个素数换行
                print()  # 换行
    print()  # 最后换行

if __name__ == "__main__":
    main()  # 调用主函数
  1. 导入模块:使用 import math 来导入数学模块,以便使用 math.sqrt() 函数计算平方根。
  2. is_prime 函数:这个函数用于检查一个数字是否为素数。它返回 True 如果是素数,返回 False 如果不是。
  3. main 函数:这是程序的主函数,遍历从 2 到 100 的每个整数,调用 is_prime 函数来检查每个数字是否为素数。
  4. 打印素数:如果是素数,则打印该数字,并在每打印 5 个素数后换行。
  5. 程序入口:使用 if __name__ == "__main__": 来确保主函数在脚本直接运行时被调用。

 方法 2: 使用埃拉托斯特尼筛法(Sieve of Eratosthenes)

这种方法是生成素数的高效算法,适合处理较大的范围。

def sieve_of_eratosthenes(max_num):
    is_prime = [True] * (max_num + 1)  # 创建布尔数组
    is_prime[0] = is_prime[1] = False  # 0 和 1 不是素数

    for i in range(2, int(max_num**0.5) + 1):
        if is_prime[i]:
            for j in range(i * i, max_num + 1, i):
                is_prime[j] = False  # 标记 i 的倍数为非素数

    return [i for i in range(2, max_num + 1) if is_prime[i]]  # 返回素数列表

def main():
    primes = sieve_of_eratosthenes(100)  # 获取 2 到 100 的素数
    for index, prime in enumerate(primes):
        print(prime, end=' ')
        if (index + 1) % 5 == 0:  # 每打印 5 个素数换行
            print()
    print()  # 最后换行

if __name__ == "__main__":
    main()

方法 3: 使用递归方法

def is_prime(num, divisor=2):
    if num < 2:
        return False
    if divisor > int(num**0.5):
        return True
    if num % divisor == 0:
        return False
    return is_prime(num, divisor + 1)

def main():
    for i in range(2, 101):
        if is_prime(i):
            print(i, end=' ')
    print()  # 最后换行

if __name__ == "__main__":
    main()

Java 实现

方法 1: 使用自定义函数判断素数

这个 Java 程序将打印 2 到 100 之间的所有素数,功能与 C 代码相同。

public class PrimeNumbers {
    public static void main(String[] args) {
        int n = 0; // 素数计数器
        for (int i = 2; i <= 100; i++) { // 遍历从 2 到 100 的每个整数
            if (isPrime(i)) { // 检查 i 是否为素数
                System.out.print(i + " "); // 打印素数
                n++; // 素数计数器加一
                if (n % 5 == 0) { // 每打印 5 个素数换行
                    System.out.println();
                }
            }
        }
        System.out.println(); // 最后换行
    }

    // 检查一个数是否为素数
    public static boolean isPrime(int num) {
        if (num < 2) return false; // 0 和 1 不是素数
        int k = (int) Math.sqrt(num); // 计算 num 的平方根
        for (int j = 2; j <= k; j++) { // 检查 num 是否能被 2 到 k 之间的任何数整除
            if (num % j == 0) return false; // 如果能整除,返回 false
        }
        return true; // 是素数
    }
}
  1. 主类:定义了一个名为 PrimeNumbers 的公共类。
  2. main 方法:程序的入口点,遍历从 2 到 100 的每个整数,调用 isPrime 方法来检查每个数字是否为素数。
  3. 打印素数:如果是素数,则打印该数字,并在每打印 5 个素数后换行。
  4. isPrime 方法:这个方法用于检查一个数字是否为素数。它返回 true 如果是素数,返回 false 如果不是。
  5. 平方根计算:使用 Math.sqrt() 方法计算平方根。

方法 2:使用埃拉托斯特尼筛法(Sieve of Eratosthenes)

这种方法是生成素数的高效算法,适合处理较大的范围。

public class PrimeNumbers {
    public static void main(String[] args) {
        int max = 100;
        boolean[] isPrime = new boolean[max + 1]; // 创建布尔数组
        for (int i = 2; i <= max; i++) {
            isPrime[i] = true; // 初始化所有数为素数
        }

        for (int i = 2; i * i <= max; i++) {
            if (isPrime[i]) {
                for (int j = i * i; j <= max; j += i) {
                    isPrime[j] = false; // 标记 i 的倍数为非素数
                }
            }
        }

        int count = 0; // 素数计数器
        for (int i = 2; i <= max; i++) {
            if (isPrime[i]) {
                System.out.print(i + " "); // 打印素数
                count++;
                if (count % 5 == 0) {
                    System.out.println(); // 每打印 5 个素数换行
                }
            }
        }
        System.out.println(); // 最后换行
    }
}

 方法 3:递归方法

public class PrimeNumbers {
    public static void main(String[] args) {
        for (int i = 2; i <= 100; i++) {
            if (isPrime(i, 2)) { // 检查 i 是否为素数
                System.out.print(i + " "); // 打印素数
            }
        }
        System.out.println(); // 最后换行
    }

    // 递归检查一个数是否为素数
    public static boolean isPrime(int num, int divisor) {
        if (num < 2) return false; // 0 和 1 不是素数
        if (divisor * divisor > num) return true; // 如果没有找到因数,返回 true
        if (num % divisor == 0) return false; // 如果能整除,返回 false
        return isPrime(num, divisor + 1); // 递归检查下一个因数
    }
}

方法 4: 使用 Java 8 的流(Streams)

利用 Java 8 的流特性来生成素数。

import java.util.stream.IntStream;

public class PrimeNumbers {
    public static void main(String[] args) {
        IntStream.rangeClosed(2, 100) // 生成 2 到 100 的整数流
                .filter(PrimeNumbers::isPrime) // 过滤出素数
                .forEach(num -> System.out.print(num + " ")); // 打印素数
        System.out.println(); // 最后换行
    }

    // 检查一个数是否为素数
    public static boolean isPrime(int num) {
        if (num < 2) return false; // 0 和 1 不是素数
        return IntStream.rangeClosed(2, (int) Math.sqrt(num)) // 生成 2 到 sqrt(num) 的整数流
                .noneMatch(divisor -> num % divisor == 0); // 检查是否有因数
    }
}

Js 实现 

这个 JavaScript 程序将打印 2 到 100 之间的所有素数

方法 1: 使用自定义函数判断素数

function isPrime(num) {
    if (num < 2) return false; // 0 和 1 不是素数
    const k = Math.sqrt(num); // 计算 num 的平方根
    for (let j = 2; j <= k; j++) { // 检查 num 是否能被 2 到 k 之间的任何数整除
        if (num % j === 0) return false; // 如果能整除,返回 false
    }
    return true; // 是素数
}

function main() {
    let n = 0; // 素数计数器
    for (let i = 2; i <= 100; i++) { // 遍历从 2 到 100 的每个整数
        if (isPrime(i)) { // 检查 i 是否为素数
            process.stdout.write(i + " "); // 打印素数
            n++; // 素数计数器加一
            if (n % 5 === 0) { // 每打印 5 个素数换行
                console.log();
            }
        }
    }
    console.log(); // 最后换行
}

main(); // 调用主函数
  1. isPrime 函数:这个函数用于检查一个数字是否为素数。它返回 true 如果是素数,返回 false 如果不是。

    • 如果数字小于 2,返回 false
    • 计算数字的平方根,并检查从 2 到平方根之间的所有整数是否能整除该数字。
  2. main 函数:这是程序的主函数,遍历从 2 到 100 的每个整数,调用 isPrime 函数来检查每个数字是否为素数。

    • 如果是素数,则打印该数字,并在每打印 5 个素数后换行。
  3. process.stdout.write:用于在控制台上打印输出,而不自动换行。这样可以更好地控制输出格式。

  4. console.log():用于在最后输出一个换行符。

方法 2:埃拉托斯特尼筛法(Sieve of Eratosthenes)

function sieveOfEratosthenes(max) {
    const isPrime = Array(max + 1).fill(true); // 创建布尔数组
    isPrime[0] = isPrime[1] = false; // 0 和 1 不是素数

    for (let i = 2; i * i <= max; i++) {
        if (isPrime[i]) {
            for (let j = i * i; j <= max; j += i) {
                isPrime[j] = false; // 标记 i 的倍数为非素数
            }
        }
    }

    return isPrime.map((prime, index) => prime ? index : null).filter(Boolean); // 返回素数列表
}

function main() {
    const primes = sieveOfEratosthenes(100); // 获取 2 到 100 的素数
    let n = 0; // 素数计数器
    primes.forEach(prime => {
        process.stdout.write(prime + " "); // 打印素数
        n++;
        if (n % 5 === 0) {
            console.log(); // 每打印 5 个素数换行
        }
    });
    console.log(); // 最后换行
}

main(); // 调用主函数

网站公告

今日签到

点亮在社区的每一天
去签到