在C ++中找到数字分隔符的最快方法

时间:2016-10-16 18:09:25

标签: c++ algorithm

我正在尝试做一个你应该找到第n个阶乘的分频器的练习:

https://www.e-olymp.com/en/problems/124

所以这是我的代码:

int fact(int n){
    return (n==1 || n==0) ? 1 : n*fact(n-1);
}
long long int a,b=1,c=0;
    cin>>a;
    long long int y=fact(a);
    while(b!=y){
        if(y%b==0){
                c++;
        }
        b++;
    }
        cout<<c+1<<endl;

但是这段代码花费了太多时间,我需要更快的东西。不要给代码,算法就足够了。

2 个答案:

答案 0 :(得分:2)

在此任务中1 <= N <= 45。显然,N太大而无法直接计算。

您应该实施另一种方法。只需从1迭代到N,然后为每个i, 1 < i <= N执行素数分解。然后,您可以轻松找到N!的素数因子分解,只需合并每个i, 1 < i <= N的因式分解。之后使用先前计算的分解来计算除数的总数。

6!的例子:

2 = 2
3 = 3
4 = 2 ^ 2
5 = 5
6 = 3 * 2

所以:

6! = 2 ^ 4 * 3 ^ 2 * 5

除数的数量:

(4 + 1) * (2 + 1) * (1 + 1) = 30

答案 1 :(得分:0)

使用一些数学。

如果您知道数字的素因子,那么计算除数的数量是微不足道的。

很容易找到阶乘的主要因素。不计算阶乘本身。