Java——快手2020校园招聘秋招笔试[编程题]质因数统计

题目:

我们知道每一个大于1的整数都一定是质数或者可以用质数的乘积来表示,如10=2*5。现在请设计一个程序,对于给定的一个(1,N] 之间的正整数(N取值不超过10万),你需要统计(1,N] 之间所有整数的质数分解后,所有质数个数的总个数。举例,输入数据为6,那么满足(1,6] 的整数为2,3,4,5,6,各自进行质数分解后为:2=>2,3=>3,4=>2*2,5=>5,6=>2*3。对应的质数个数即为1,1,2,1,2。最后统计总数为7

输入描述:

输入数据包含1行,为一个大于1的整数(不超过10万)。

输出描述:

输出小于等于该数的所有整数质数分解后的总个数。

输入例子1:

6

输出例子1:

7

题目分析:

首先我们需要求出一个数(设为x)质数分解后对应的质数个数,这一步需要判断x是不是质数。

(1)如果是质数,则不需要继续判断,直接返回1 

(2)如果不是质数,则x一定可以整除一个质数(设这个质数为a),令k= x/a,将k带入步骤(1),并令对应的质数加一(使用递归比较好理解)。

代码:

import java.util.*;

public class test0 {
    public static void main(String[] args) {
        System.out.println("输入数据包含1行,为一个大于1的整数(不超过10万)");
        Scanner scanner = new Scanner(System.in);
        int i = scanner.nextInt();
        int k = 0;
        for (int j = 2; j <= i; j++) {
            k+=resolveNum(j);
        }
        System.out.println(k);
    }

    public static int resolveNum(int i){

        if (isPrimeNum(i)){
            return 1;
        }

        int k = 0;
        for (int j = 2; j < i; j++) {
            if (i%j==0&&isPrimeNum(j)){
                k=i/j;
            }
        }
        return 1+resolveNum(k);
    }

    public static boolean isPrimeNum(int i){
        if (i<2){
            return false;
        }
        for (int j = 2; j < i; j++) {
            if (i%j!=0){
                continue;
            }
            if (i%j==0){
                return false;
            }
        }
        return true;
    }

}

输出结果:

首先输入6,结果为

输入数据包含1行,为一个大于1的整数(不超过10万)
6
7

在验证其他值,比如输入8,结果为:

输入数据包含1行,为一个大于1的整数(不超过10万)
8
11

总结:

质数是从2开始判断的,因此应该从2开始循环判断。代码都是我自己想法写的,若有错误的地方欢迎指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值