云上day-12

题目描述

编程求 2 ~ n(n 为大于 2 的正整数)中有多少个素数。

题目链接:B2128 素数个数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

输入格式

输入 n(2 ≤ n ≤ 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;
    }
}

素数是经常遇到的一个问题,对于求比较大范围内的素数个数可以选择使用线性筛进行优化,大家可以去了解一下:

素数筛(线性筛法)_噬梦罪犯的博客-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值