C小加

厚德 博学 求真 至善 The bright moon and breeze
posts - 145, comments - 195, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

给定两个数m,n

求m!分解质因数后因子n的个数。

这道题涉及到了大数问题,如果相乘直接求的话会超出数据类型的范围。

下面给出一种效率比较高的算法,我们一步一步来。

m!=1*2*3*……*(m-2)*(m-1)*m

可以表示成所有和n倍数有关的乘积再乘以其他和n没有关系的

    =(n*2n*3n*......*kn)*ohter     other是不含n因子的数的乘积   因为 kn<=m 而k肯定是最大值  所以k=m/n

    =n^k*(1*2*......*k)*other  

    =n^k*k!*other     

从这个表达式中可以提取出k个n,然后按照相同的方法循环下去可以求出k!中因子n的个数。

每次求出n的个数的和就是m!中因子n的总个数。

 
#include
<iostream>
using namespace std;
int get(int n,int m)
{
    
int sum=0,k;
    
while(n)
    {
        k
=n/m;
        sum
+=k;
        n
=k;
    }
    
return sum;
}
int main()
{
    
int n;
    cin
>>n;
    
while(n--)
    {
        
int a,b;
        cin
>>a>>b;
        cout
<<get(a,b)<<endl;
    }
}        

 

Feedback

# re: NYOJ 56 70 阶乘因式分解 解题报告  回复  更多评论   

2011-11-09 20:15 by 博洋家纺
不错

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理