PAT乙级(Basic Level)练习题 因子个数

题目描述
一个正整数可以分解成一个或多个数组的积。例如36=223*3,即包含2和3两个因子。NowCoder最近在研究因子个数的分布规律,现在给出一系列正整数,他希望你开发一个程序输出每个正整数的因子个数。

输入描述:
输入包括多组数据。
每组数据仅有一个整数n (2≤n≤100000)。

输出描述:
对应每个整数,输出其因子个数,每个结果占一行。

输入例子:

30
26
20

输出例子:

3
2
2

\color{blue}解题思路:
这道题和上一道题 PAT乙级(Basic Level)练习题 分解因数 是一样的,只不过上一题是让你输出分解的因数序列,此题是让你计算因子个数。
关于如何分解素数因子,请参考上一篇博客,有详细的解释,这里不再赘述。
我们只需将上一题稍微改造一下即可。

\color{blue}代码实现:

#include <iostream>
#include <math.h>
using namespace std;

int main(int argc, const char * argv[]) {
    int number = 0;
    //scanf返回值为正确输入数据的变量个数,当一个变量都没有成功获取数据时,此时返回-1
    while (scanf("%d", &number) != - 1) {
    	//因子个数
        int count = 0;
        //只需要从[2, sqrt(number)]试探即可
        int maxEle = sqrt(number);
        for (int i = 2; i <= maxEle && number != 1; ++i) {
            //如果能分解出i,则一直分解出i,直到不能再分解,这样可以避免分解出i的倍数(i的倍数一定是合数)
            if (number % i == 0) {
                ++count;//因子个数自增
                while (number % i == 0) {
                    number /= i;
                }
            }
        }
        //如果最后number > 1,说明还有一个素数因子,比如当输入2、3时,并没有进入for循环
        printf("%d\n", number > 1 ? count + 1 : count);
    }
    return 0;
}

在这里插入图片描述

发布了1005 篇原创文章 · 获赞 269 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/qq_41855420/article/details/104659060
今日推荐