6. 质因数的个数

作者: IceFrozen | 来源:发表于2018-12-31 10:51 被阅读0次
题目描述

求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如120=22235,共有5个质因数。

输入描述:

可能有多组测试数据,每组测试数据的输入是一个正整数N,(1<N<10^9)。

输出描述:

对于每组数据,输出N的质因数的个数。

示例1

输入

120

输出

5

思路

质数基本定理说,一个大于1的整数要么本身是质数,要么可以被分解成质数之积,1既不是质数也不是合数。
对于100这个整数,我们来试着手工分析其质因子,从2开始试,

100%2=0,所以2是其一个质因子,100/2=50
50%2=0,2是其一个质因子,50/2=25
25%2=1,25%3=1,25%4=1,25%5=0,所以5是其一个质因子,25/5=5
5%2=1,5%3=2,5%4=1,5%5=0,5是其一个质因子,5/5=1,分解完毕

解法

由上面的思路,可以直接写出代码

#include<stdio.h>

int main(){
    int x = 0;    //输入的数
    while(scanf("%d", &x) != EOF){
        int count = 0;
        for(int i = 2; i <= x; i++){
            while(x % i == 0){    //从2开始试,用while循环把遇到的质数试干净,再继续往上试
                count++;
                x /= i;
            }
        }
        printf("%d\n", count);
    }
    return 0;
}

这个算法是正确的,但是只通过OJ的95%的数据测试,报错运行时间超出,说明时间复杂度太高,还需要继续优化。
改变for循环的规模,修改为:

#include<stdio.h>

int main(){
    int x = 0;    //输入的数
    while(scanf("%d", &x) != EOF){
        int count = 0;
        for(int i = 2; i * i <= x; i++){
            while(x % i == 0){    //从2开始试,用while循环把遇到的质数试干净,再继续往上试
                count++;
                x /= i;
            }
        }
        if(x > 1)
            count ++;
        printf("%d\n", count);
    }
    return 0;
}

模拟一遍就能很好的明白这个算法了,
假设输入的数是37,则for循环从0到6,这已经够了,因为37的质数要么是37本身,要么一定小于6,因为如果大于6的话,假设那个数是a,则37/a也一定小于6,也就是说循环不到a的,所以0到6这个循环够用了,循环结束的时候,如果质数都已经测试出来了,那么之前输入的数肯定会变成1,如果大于1的话,则之前输入的数本身就是一个质数。

相关文章

  • 6. 质因数的个数

    题目描述 求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如120=22235,共有5个质因数。 ...

  • 分解素因数——1. 质因数的个数

    质因数的个数 题目描述 求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如120=22235,共有...

  • 质因数的个数

    题目链接题目描述求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如120=22235,共有5个质因...

  • 质因数分解

    题目:求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如120=22235,共有5个质因数。 x(...

  • 质数因数的个数

    求正整数N(N>1)的质因数的个数。 相同的质因数需要重复计算。如120=2*2*2*3*5,共有5个质因数。 解...

  • 阶乘分解

    题目链接:阶乘分解分解阶乘的质因数。将1~N每个数,分别分解质因数合并的时间复杂度是。对于N!来说假设p

  • 求最大公约数和最小公倍数

    求最小公倍数 有两种方法 (1)分解质因数法 先把两个数用其质因数的乘积表示出来如:求45和30的最小公倍数45 ...

  • 分解质因数

    //输入两个数字a,b,则输出从a到b之间的所有整数的分解出质因数乘积的式子 void calArray(int ...

  • 一、语句部分习题(下)

    1.检验控制台输入的日期是否合法 2.判断是不是质数 3.找出一个数的质因数 思路:输入一个数,最小的质因子是2,...

  • 如果我不会……

    昨天我批改孩子们回家作业,有一题要求一个数的最大公因数,有六七个孩子将两个数先分解质因数,然后再得出最大公...

网友评论

    本文标题:6. 质因数的个数

    本文链接:https://www.haomeiwen.com/subject/yclilqtx.html