单身狗进化(C语言)

单身狗进化(C语言)

题目


输入20输出19

参考代码(初版)

#include <stdio.h>
int main()
{
    // 单身狗进化
    int n;
    scanf("%d", &n);
    long long sum = 1;
    for (int i = 1; i <= n; i++)
    {
        sum *= i;
    }
    int num = 0;
    while (sum > 0)
    {
        sum /= 10;
        num++;
    }
    printf("%d", num);
    return 0;
}

参考代码(更优)

#include <stdio.h>
#include <math.h>
int main()
{
    // 单身狗进化
    int n;
    scanf("%d", &n);
    double log_sum = 0.0; // 阶乘容易溢出,double表示的数范围更广
    for (int i = 1; i <= n; i++)
    {
        log_sum += log10(i); // 对数的和相当于真数相乘,log_sum = log10(1)+log10(2)+...+log10(n) = log10(n!)
    }
    int digits = (int)(log_sum) + 1; //(int)强制类型转换,直接去除小数部分,只保留整数部分
    // 如 n = 5, n! = 1*2*3*4*5 = 120, log10(120) = 2.0792
    // log_sum 最终值为 2.0792,整数部分为 2,表示阶乘结果在 10^2 和 10^3 之间。因此,阶乘的位数为 (int)(log_sum) + 1 = 3。
    printf("%d\n", digits);
    return 0;
}

posted @ 2024-08-31 19:13  yesno233233  阅读(69)  评论(0)    收藏  举报