必威体育Betway必威体育官网
当前位置:首页 > IT技术

质因数的个数

时间:2019-11-06 13:43:21来源:IT技术作者:seo实验室小编阅读:66次「手机版」
 

质因数

题目描述

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

输入描述:

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

输出描述:

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

示例1

输入

120

输出

5

思路

1)题目需要多组测试用例,我的第一个想法是没能每个测试用例都去判断质数,所以可以使用打表法,把100000以内的质数标记出来

2)因为c++中的数组不能太大(同时也是考虑到题目有内存要求),标记的质数表不能全部包含所有可能的输入数据的质因数,这里就有一个小技巧:如果输入的数据n已经和2到n的开方之前的质数计算后,剩余不为1,则表示还存在一个大于质数表内的质数

#include<stdio.h>
#include<math.h>
#define maxSize 100000
int a[maxSize]= {0};//用于存储质数表,下标即为该数值,当数组值为0代表为质数,1为非质数
int main()
{
    //使用筛选法
    for(int i=2; i<10; i++)
        {
            for(int j=i*i; j<maxSize; j+=i)
            {
                a[j]=1;
            }
        }

    int n,sum,temp;//sum存放质因数个数
    while(scanf("%d",&n)!=EOF)
    {
        if(n<maxSize&&a[n]==0){//当输入的数小于数组的最大值,且对应数组值为0,即该数为质数
            printf("1\n");
            continue;
        }
        sum=0,temp=n;
        for(int i=2;i<=sqrt(n)+1;i++)//在2到该数的开方值范围内的质数表中进行计算
        {
            if(!a[i]){
                while(!(temp%i))
                {
                    sum++;
                    temp/=i;
                }
            }

        }
        if(temp!=1) sum++;//如果temp计算后的值不为1,代表剩余的值是一个大于质数表内的质数
        printf("%d\n",sum);
    }

}

思路升级

其实不需要再循环里判断i是为为质数,如果i是合数,则一定不会被整除:那前面的质数一定已经合数中包含的质数被整除过了

#include <iOStream>
#include <math.h>
using namespace std;
int main(){
    int n;
    while(cin>>n){
       int i,count=0;
       for(i=2;i<=sqrt(n);i++){
           while(n%i==0){
               count++;
               n/=i;
           }
           if(n<1) break;
       }
       if(n>1) count++;
       cout<<count<<endl;
    }
    return 0;
}

文章最后发布于: 2018-05-16 17:13:23

相关阅读

Office小知识(一)——word插入各种方向和条件个数的大括

Word中插入左右上下,多个单个花括号的总结 一:左右大括号(单个) 点击插入->公式,选择“括号”->“单方括号”,在插入的括号的虚线框中

计算烷烃的同分异构体个数

相当于计算度数不超过4的无标号无根树个数。按照无根树的套路,我们直接枚举子树即可。但是无根树可以用exp来搞,这个度数有限制。我

约数的个数,基础知识不牢导致的问题

题目描述输入n个整数,依次输出每个数的约数的个数。输入输入的第一行为N,即数组的个数(N<=1000)接下来的1行包括N个整数,其中每个数

求两个数的最大公约数(C语言)

辗转相减法: #include <stdio.h> #include <stdlib.h> int main() { int a, b; printf("请输入要求公约数的两个数:"); scanf(

7000 字深度总结:运营必备的 15 个数据分析方法

这篇文章来自 GrowingIO 联合创始人 & 运营副总裁陈明先生,全文总结了 15 个运营必备的数据分析方法论。不论是刚刚入行的萌新,还是

分享到:

栏目导航

推荐阅读

热门阅读