我正在尝试编写代码来计算特定数字(大数字)的阶乘中尾随零的数量。但是,对于较小的数字,我会得到正确的结果,但是对于较大的数字,偏差会不断增加。我的逻辑怎么了
#include <stdio.h>
int main(void) {
int t;
scanf("%d", &t);
while (t > 0) {
int factorten = 0, factorfive = 0, factortwo = 0, remainingfive = 0,
remainingtwo = 0;
unsigned int factors = 0;
unsigned int n;
scanf("%u", &n);
for (unsigned int i = n; i > 0; i--) {
if (i % 10 == 0) {
factorten++;
continue;
} else if (i % 5 == 0) {
factorfive++;
continue;
} else if (i % 2 == 0) {
// int new = i;
// while(new % 2 == 0)
//{
// new = new / 2;
factortwo++;
//}
continue;
}
}
factors = factors + factorten;
printf("%u\n", factors);
if (factorfive % 2 == 0 && factorfive != 0) {
factors = factors + (factorfive / 2);
} else {
remainingfive = factorfive % 2;
factors = factors + ((factorfive - remainingfive) / 2);
}
printf("%u\n", factors);
if (factortwo % 5 == 0 && factortwo != 0) {
factors = factors + (factortwo / 5);
} else {
remainingtwo = factortwo % 5;
factors = factors + ((factortwo - remainingtwo) / 5);
}
printf("%u\n", factors);
if ((remainingfive * remainingtwo % 10) == 0 &&
(remainingfive * remainingtwo % 10) != 0) {
factors++;
}
printf("%u\n", factors);
t--;
}
}
样本输入:
6
3
60
100
1024
23456
8735373
样本输出:
0
14
24
253
5861
2183837
我的输出
0
13
23
235
5394
2009134
最佳答案
编辑:忽略前两个,它们是次优的。第三种算法是最佳的。
我认为这可以完成您要尝试做的事情,但是更加简单且有效:
int tzif(int n)
{
int f2 = 0, f5 = 0;
for (;n > 1; n--)
{
int x = n;
for (;x % 2 == 0; x /= 2)
f2++;
for (;x % 5 == 0; x /= 5)
f5++;
}
return f2 > f5 ? f5 : f2;
}
它计算数字N ... 2的2因子和5因子。然后它返回两者中的较小者(因为添加2因子在不添加5因子的情况下是无用的,反之亦然)。您的代码太奇怪了,我无法分析。
我认为这也应该起作用,因为阶乘将具有足够的2因子来“覆盖” 5因子:
int tzif(int n)
{
int f5 = 0;
for (;n > 1; n--)
for (x = n;x % 5 == 0; x /= 5)
f5++;
return f5;
}
这仅计算5个因素并返回。
我认为应该起作用的另一种方法:
int tzif(int n)
{
int f5 = 0;
for (int d = 5; d <= n; d *= 5)
f5 += n / d;
return f5;
}
计算每五个数字(每个数字都有一个5因子),然后计数每个第25个数字(每个数字都有另一个5因子),依此类推。
关于c - 在阶乘中尾随零,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25764514/