蓝桥杯-质因数个数

举报
别团等shy哥发育 发表于 2023/04/04 23:03:33 2023/04/04
【摘要】 @toc 1、问题描述给定正整数 n, 请问有多少个质数是 n 的约数。输入格式输入的第一行包含一个整数 n。输出格式输出一个整数, 表示 n 的质数约数个数。样例输入396样例输出3样例说明396 有 2,3,11 三个质数约数。评测用例规模与约定对于 30% 的评测用例, 1≤n≤10000 。对于 60% 的评测用例,1≤n≤10910^9109 。对于所有评测用例, 1≤n≤1016...

@toc

1、问题描述

给定正整数 n, 请问有多少个质数是 n 的约数。

输入格式

输入的第一行包含一个整数 n

输出格式

输出一个整数, 表示 n 的质数约数个数。

样例输入

396

样例输出

3

样例说明

396 有 2,3,11 三个质数约数。

评测用例规模与约定

对于 30% 的评测用例, 1≤n≤10000 。

对于 60% 的评测用例,1≤n 1 0 9 10^9

对于所有评测用例, 1≤n 1 0 16 10^{16}

运行限制

  • 最大运行时间:10s
  • 最大运行内存: 512M

2、解题思路

质数又被称为素数,是指一个大于1的自然数,除了1和它本身外,不能被其他的自然数整除。

2.1 质数判断

判断一个数字是否是质数,就是看它的因子是否只有1和它本身。质数的判断我们简单写个函数判断就行,代码如下,遍历的时候不需要从2到n,只需要遍历到n的平方根即可。

//判断因子是否是质数
    public static boolean judge(long n){
        if(n==0||n==1){
            return false;
        }
        for (long i = 2L; i <=Math.sqrt(n); i++) {
            if(n%i==0){
                return false;
            }
        }
        return true;
    }

2.2 求取因子

关于一个数字的因子,我们在这里找出所有能够被我们输入的数字n整除的数即可,并且可以用一个数组或者集合去收集这些因子,求因子的代码实现如下:

遍历到Math.sqrt(n)即可。

 //返回因子list
    public static List<Long> factor(long n){
        ArrayList<Long> arr = new ArrayList<>();
        for (long i = 1L; i <=Math.sqrt(n) ; i++) {
            if(n%i==0){
                arr.add(i);
                if(i!=n/i){
                    arr.add(n/i);
                }
            }
        }
        return arr;
    }

上面两步已经完成了求取因子和判断质数的函数,我们只需要遍历因子集合,判断每个因子是否是质数即可,用一个计数器变量count来统计质因子的个数就行,最后输出这个count

3、完整代码实现

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        long n=scan.nextLong();
        List<Long> factor = factor(n);
        long count=0L;
        for (Long f : factor) {
            if (judge(f)) {
                count++;
            }
        }
        System.out.println(count);
        scan.close();
    }
    //返回因子list
    public static List<Long> factor(long n){
        ArrayList<Long> arr = new ArrayList<>();
        for (long i = 1L; i <=Math.sqrt(n) ; i++) {
            if(n%i==0){
                arr.add(i);
                if(i!=n/i){
                    arr.add(n/i);
                }
            }
        }
        return arr;
    }
    //判断因子是否是质数
    public static boolean judge(long n){
        if(n==0||n==1){
            return false;
        }
        for (long i = 2L; i <=Math.sqrt(n); i++) {
            if(n%i==0){
                return false;
            }
        }
        return true;
    }
}

输入一个测试用例试一下

image.png

2、3、11是396的三个质因数。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。