目录
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: 使用埃拉托斯特尼筛法
- 使用更高效的素数检测算法:对于较大的范围,可以考虑使用埃拉托斯特尼筛法(Sieve of Eratosthenes)来生成素数,这样效率更高。
- 代码可读性:可以增加注释,或者将部分逻辑封装成函数,以提高代码的可读性和可维护性。
- 输出格式:可以在输出的最后添加换行符,以使输出更整洁。
#include <stdio.h>
#include <stdbool.h>#define MAX 100int 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 mathdef is_prime(num):if num < 2:return Falsefor j in range(2, int(math.sqrt(num)) + 1):if num % j == 0:return Falsereturn Truedef 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() # 调用主函数
- 导入模块:使用
import math
来导入数学模块,以便使用math.sqrt()
函数计算平方根。 is_prime
函数:这个函数用于检查一个数字是否为素数。它返回True
如果是素数,返回False
如果不是。main
函数:这是程序的主函数,遍历从 2 到 100 的每个整数,调用is_prime
函数来检查每个数字是否为素数。- 打印素数:如果是素数,则打印该数字,并在每打印 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 Falseif divisor > int(num**0.5):return Trueif num % divisor == 0:return Falsereturn 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; // 是素数}
}
- 主类:定义了一个名为
PrimeNumbers
的公共类。 main
方法:程序的入口点,遍历从 2 到 100 的每个整数,调用isPrime
方法来检查每个数字是否为素数。- 打印素数:如果是素数,则打印该数字,并在每打印 5 个素数后换行。
isPrime
方法:这个方法用于检查一个数字是否为素数。它返回true
如果是素数,返回false
如果不是。- 平方根计算:使用
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; // 如果没有找到因数,返回 trueif (num % divisor == 0) return false; // 如果能整除,返回 falsereturn 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(); // 调用主函数
-
isPrime
函数:这个函数用于检查一个数字是否为素数。它返回true
如果是素数,返回false
如果不是。- 如果数字小于 2,返回
false
。 - 计算数字的平方根,并检查从 2 到平方根之间的所有整数是否能整除该数字。
- 如果数字小于 2,返回
-
main
函数:这是程序的主函数,遍历从 2 到 100 的每个整数,调用isPrime
函数来检查每个数字是否为素数。- 如果是素数,则打印该数字,并在每打印 5 个素数后换行。
-
process.stdout.write
:用于在控制台上打印输出,而不自动换行。这样可以更好地控制输出格式。 -
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(); // 调用主函数