题目描述
编程求 2 ~ ( 为大于 2 的正整数)中有多少个素数。
题目链接:B2128 素数个数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
输入格式
输入 (2 ≤ ≤ 50000)。
输出格式
素数个数。
解题思路
本题的关键是如何判断一个数是否为素数,根据素数的定义:只有1和它本身两个因子,因此我们需要通过遍历的方式,判断这个数是否还有其它的因子,如果遇到有其它的因子说明不是素数。
对于每个数都需要判断是否为素数,因此,我们定义一个判断是否为素数的函数进行判断,这里涉及到函数的定义:
返回值类型 函数名(参数列表){
函数里面的语句;
}
根main方法的定义格式一模一样(到时候可以专门做一期关于函数的文章!)
解题代码
C代码
#include<stdio.h>
#include<math.h>
int isPrime(int n);//判断素数函数
int main(){
int n;
scanf("%d",&n);
int cnt = 0;//定义cnt记录素数个数
for(int i = 2; i <= n; i++){
if(isPrime(i) == 1)
cnt++;
}
printf("%d",cnt);
return 0;
}
int isPrime(int n)
{
for(int i = 2; i <= sqrt(n); i++){ //若n的算术平方根后再判断会重复
if(n % i == 0)
return 0;//能被整除返回0,表示不是素数
}
return 1;
}
C++代码
#include<bits/stdc++.h>
using namespace std;
//判断是否是素数
bool isprime(int x)
{
//如果有因子总是成对出现所以只用判断到x的算术平方根
for(int i=2;i<=sqrt(x);i++){
if(x % i == 0) return false; //是合数直接返回false
}
return true; //否则返回true
}
int main()
{
int n,cnt = 0;
cin>>n;
for(int i=2;i<=n;i++) {
if(isprime(i)) cnt++; //是素数则计数加一
}
cout<<cnt;
return 0;
}
Java代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//输入数据
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
//定义个数变量
int num = 0;
//遍历
for (int i = 2; i <= n; i++){
if(isPrime(i)){
num++;
}
}
//输出数据
System.out.println(num);
}
//定义和声明求判断素数的方法
//其中一个数的因子不会大于它平方根,减少遍历次数
public static boolean isPrime(int number){
for (int i = 2; i <= Math.sqrt(number); i++){
if(number % i == 0)return false;
}
return true;
}
}
素数是经常遇到的一个问题,对于求比较大范围内的素数个数可以选择使用线性筛进行优化,大家可以去了解一下: