单身狗进化(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;
}
浙公网安备 33010602011771号