【发布时间】:2020-12-21 16:16:55
【问题描述】:
我需要计算大阶乘中特定数字(0 到 9 之间)的计数
#include <stdio.h>
int main()
{
unsigned long long int x;
int n , count = 0;
scanf("%llu %d", &x , &n);
int i = x - 1;
while(i > 1)
{
x *= i;
i--;
}
while (x>0)
{
if(x%10 == n) count++;
x /= 10;
}
printf("%d",count);
return 0;
}
这适用于小数字
输入:
7 0
输出:
2
说明: 7! = 5040 有两个零
但大数字需要很长时间
输入:
50 2
输出:
overflow and time limit!
有什么想法可以在时间上优化这个程序吗? 例如计算位数而不计算阶乘的数学方法
【问题讨论】:
-
请注意,您无法计算 50!使用
unsigned long long。最多20个!但是21!溢出。我不明白您为什么要获得 50 的 时间限制!不过。 -
如果您想计算
50!,您需要转换为扩展精度格式。最简单的方法是使用像 Python 这样具有内置 bignum 支持的语言。如果你想使用 C,你需要找到一个扩展精度的整数包(或者自己写一个)。 -
Stirling's approximation 将近似 total 位数,如果您正在制作自己的大阶乘函数,这可能会很方便。
-
@WeatherVane 我不明白为什么你的时间限制是 50!虽然可能的 CPU 时间受限于
ulimit -t ... -
@AndrewHenle 但代码只需要 49 次乘法和 18 次除法!测量这么短的时间间隔非常困难。
标签: c optimization count factorial