2017-01-27 47 views
1

我有以下问题,如标题所述:对于N的每个值,打印出N!中有多少个数字。例如,如果n = 32000,我应该得到130271. 我曾想过一个递归解决方案。它适用于较小的数字,但对于上面的例子,它打印31997.我相信我的想法是错误的,但我无法找到更大数字的规则。某处,n!我想,开始跳过步骤。我的意思是,它不会随着数字增加,而是会增加两到三个。 我有以下代码:对于N的每个值,打印N个因子中有多少个数字

#include <stdio.h> 
#include <stdlib.h> 

//For each value of N, print out how many digits are in N!. 

int how_many(int n){ 
    if(n <= 3) 
     return 1; 
    if(n == 4) 
     return 2; 
    if(n == 5 || n == 6) 
     return 3; 
    if(n >= 7) 
     return 1 + how_many(n-1); 

    } 


int main() 
{ 
    int n; 
    printf("The number n is : "); 
    scanf("%d", &n); 

    int counter = 0; 

    counter = how_many(n); 

    printf("n! has %d digits", counter); 

    return 0; 
} 

回答

1

@JohnZwinck的答案解决了我的问题。下面是生成的代码:

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

#define M_PI 3.14159265358979323846 

//For each value of N, print out how many digits are in N!. 

int digits_in_factorial(int n){ 
    return floor((n+0.5)*log(n) - n+ 0.5*log(2*M_PI))/log(10) + 1; 
} 

int main() 
{ 
    int n; 
    printf("Numarul n este : "); 
    scanf("%d", &n); 

    int counter = 0; 

    counter = digits_in_factorial(n); 

    printf("n! are %d cifre", counter); 

    return 0; 
} 
+0

您是否想回答自己的问题?通常人们会将这类事情作为对其原始问题的修改,并将其中的一个答案标为最有帮助的答案。 – Richard

+0

@Richard将其作为答案发布是正确的做法。他/她可以选择注册其他有用的答案并接受一个答案(她自己或某人的答案)。 –

+0

@KlasLindbäck:已确认。在这种情况下,他们的措辞“就是这样,谢谢。”似乎暗示他们认为他们正在回答他人的回答。 – Richard

0

OP的递归方法估计过低:

return 1 + how_many(n-1); 

应该更像

return log10(n) + how_many(n-1); 

使用OP的原始整数做法及以下how_many(32000) --> n! has 123560 digits - 更好的估计。

int how_many(int n) { 
    if (n <= 3) 
    return 1; 
    if (n == 4) 
    return 2; 
    if (n == 5 || n == 6) 
    return 3; 

    int count = 0 + how_many(n - 1); 
    while (n > 3) { 
    n /= 10; 
    count++; 
    } 
    return count; 
} 

IAC,OP has found斯特林的方法。

相关问题