【问题标题】:Find the number of digit(s) of the factorial of an integer in a certain base查找某个基数中整数的阶乘的位数
【发布时间】:2016-12-01 11:16:51
【问题描述】:

我的解决方案非常快,但还不够。我需要更快。我怎样才能减少我的时间? 输入数:n (0 ≤ n ≤ 1000000) 基数应该是:基数 (2 ≤ base ≤ 1000)

  1. 输入 5!在 10 基地。输出为:3
  2. 输入 22!在 3 基地。输出为:45

时间限制:2 秒,内存限制:32 MB

这是我的c语言代码:


#include<stdio.h>
#include<math.h>
int factorialDigitExtended ( int n, int base ) {
    double x = 0;
    for ( int i = 1; i <= n; i++ ) {
        x += log10 ( i ) / log10(base);
    }
    int res = ( (int) x ) + 1;
    return res;
}

int main(){
    int i, t, n, b;
    for(i=1; i<= t; i++){
        scanf("%d %d", &n, &b);
        printf("Case %d: %d\n", i, factorialDigitExtended(n, b));
    }
    return 0;
}

【问题讨论】:

  • 您如何衡量执行时间?执行时间很大程度上取决于您使用的机器,您是否有特定的设置?
  • 请定义“更快”
  • 这是一个代码审查问题,你必须在这里问它codereview.stackexchange.com
  • 时间限制:2 秒,内存限制:32 MB
  • 时间限制是多少?

标签: c base factorial


【解决方案1】:

就像我在上面的评论中提到的,这可能是针对特定行为的。我会看一些东西:

只计算一次常量值:

int factorialDigitExtended ( int n, int base ) {
    double x = 0;
    double lbase = log10(base);
    for ( int i = 1; i <= n; i++ ) {
        x += log10 ( i ) / lbase;
    }
    int res = ( (int) x ) + 1;
    return res;
}

除法可能很昂贵:

int factorialDigitExtended ( int n, int base ) {
    double x = 0;
    double lbase = 1 / log10(base);
    for ( int i = 1; i <= n; i++ ) {
        x += log10 ( i ) * lbase;
    }
    int res = ( (int) x ) + 1;
    return res;
}

不要重复相同的乘法n次:

int factorialDigitExtended ( int n, int base ) {
    double x = 0;
    double lbase = 1 / log10(base);
    for ( int i = 1; i <= n; i++ ) {
        x += log10 ( i );
    }
    x *= lbase;
    int res = ( (int) x ) + 1;
    return res;
}

0 比较可能更便宜:

int factorialDigitExtended ( int n, int base ) {
    double x = 0;
    double lbase = 1 / log10(base);
    for ( int i = n; i > 0; --i ) {
        x += log10 ( i );
    }
    x *= lbase;
    int res = ( (int) x ) + 1;
    return res;
}

Btw (int) x 可能由于精度问题而在某些时候失败。

可能还有处理器特定的对数指令。

【讨论】:

  • log 可能比log10 稍快。
猜你喜欢
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-28
  • 2010-11-30
相关资源
最近更新 更多