zoukankan      html  css  js  c++  java
  • 分解素因数

    题目描述

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

    输入描述:

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

    输出描述:

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

    输入

    120
    

    输出

    5

    解题思路:利用素数筛选法预先筛选出在数据范围内的素数,然后判断其是否为n的因数。若确定某素数为n的因数,则通过试除确定其对应的幂指数,最后求出各个幂指数的和即为所求

                      还有一个问题是素数筛选只筛选到100000即可。因为n至多存在一个大于sqrt(n)的素因数(否则两个大于sqrt(n)的数相乘即大于n)。因而只有将n所有小于sqrt(n)的素数从n中除去,剩余的部分必为该大素因数,并且有且仅有一个。

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 
     4 void Init();
     5 
     6 int mark[100001];
     7 int prime[10001];
     8 int primeSize;
     9 
    10 int main()
    11 {
    12     int n;
    13 //    int ansPrime[30];//按顺序保存分解出的素因数
    14     int ansSize,ans;  //分解出素因数个数
    15     int ansNum[30];   //保存素因数的幂数
    16     int i;
    17     Init();
    18 
    19     while( scanf("%d",&n)!=EOF)
    20     {
    21         ansSize = 0;
    22         ans = 0;
    23 
    24         for( i=0; i<primeSize; i++)
    25         {
    26             if( n%prime[i]==0 )
    27             {
    28 //                ansPrime[ansSize] = prime[i];
    29                 ansNum[ansSize] = 0;
    30                 while( n%prime[i]==0)
    31                 {
    32                     ansNum[ansSize]++;
    33                     n /= prime[i];
    34                 }
    35                 ansSize++;
    36                 if( n==1 ) break;  //n变为1表明n的所有素因素全部分解完
    37             }
    38         }
    39         if( n!=1)
    40         {
    41             //若测试完到100000内的素数.n仍未被分解为1,则下一个因素一定是此时的n
    42 //            ansPrime[ansSize] = n;
    43             ansNum[ ansSize++] = 1;  //其幂指数一定是1
    44         }
    45         for(i=0; i<ansSize; i++ )
    46         {
    47             ans += ansNum[i];
    48         }
    49         printf("%d
    ",ans);
    50     }
    51     return 0;
    52 }
    53 
    54 void Init()
    55 {
    56     int i,j;
    57     primeSize=0;
    58 
    59     for( i=1; i<=100000; i++)
    60     {
    61         mark[i] = 0;
    62     }
    63     for( i=2; i<100000; i++)
    64     {
    65         if( mark[i]==1) continue;
    66         prime[primeSize++] = i;
    67         if(i >=1000) continue;
    68         for( j=i*i; j<100000; j+=i)
    69         {
    70             mark[j] = 1;
    71         }
    72     }
    73 }
    在这个国度中,必须不停地奔跑,才能使你保持在原地。如果想要寻求突破,就要以两倍现在速度奔跑!
  • 相关阅读:
    jhljx跑跑跑(找规律)
    FFT教你做乘法(FFT傅里叶变换)
    寻找最远点对(凸包求解)
    捡火柴的Nova君(n个线段相交问题)
    生命游戏/Game of Life的Java实现
    如果看了此文你还不懂傅里叶变换,那就过来掐死我吧【完整版】(转)
    北航第十一届程序设计竞赛网络预赛题解
    LeetCode 3 Longest Substring Without Repeating Characters(最长不重复子序列)
    UVa 112
    LeetCode 2 Add Two Numbers(链表操作)
  • 原文地址:https://www.cnblogs.com/yuxiaoba/p/8441094.html
Copyright © 2011-2022 走看看