错误的类型
编译器错误消息是因为pow 例程例程使用double 类型,但% 运算符只接受整数操作数。
pow 是一个用于求幂的诱人例程,但它返回浮点类型,您通常不应混合使用浮点和整数运算,原因包括:
- 在使用浮点运算时存在相当多的问题和微妙之处,包括处理舍入错误的问题。
-
pow 的某些实现存在缺陷,因为当精确答案可以在 double 类型中表示时,它们会返回不精确的答案。例如,pow(5, 3) 可能会返回一个略低于 125 的数字,然后取一个余数模(或将其截断为整数)不会得到您想要的结果。
更好的方法
解决当前问题的一种方法是将pow 替换为您自己的例程,该例程只需通过重复相乘即可将整数提升为非负整数幂。但是,有更好的方法。更改这两行:
for (j = 1; (n % pow(5, j)) == 0; j++)
sum = sum + (n / pow(5, j));
到这里:
for (j = 1; n % 5 == 0; j++)
{
n /= 5;
sum = sum + n;
}
因此,我们不是重复使用 5 的幂(5、25、125,...)与 n,而是重复将 n 除以 5。
其他问题
如果pow 返回整数类型,这些更改将提供代码执行您问题中的代码所执行的操作,以防溢出。但是,我怀疑您的代码中还有其他问题,它无法计算出您想要的结果。
我认为你的任务很可能是编写一个程序来计算 n 中尾随零的数量! (n 阶乘) 以十进制书写。 n 中尾随零的数量!是除以 n! 的 10 的最大幂的指数。此功效由可用的 5 因子决定,因为每个尾随的零都需要 n! 中的因子 2 和因子 5(使 10),但它受到因子的约束5,因为 2 的因数很多。
因此,1!、2!、3! 和 4!没有尾随零,因为它们没有因子 5. 5!有一个尾随零,6!、7!、8! 和 9! 也是如此。然后10!有两个尾随零,正如我们所见,因为 1•2•3•4•5•6•7•8•9•10 有两个因数 5。尾随零在 15 处增加到 3! 20 岁时有四个!到目前为止,n! 的尾随零的数量!为 n/5,截断为整数。然后,在 25! 处,我们添加的不是一个,而是两个 5,因为 25 是 52。现在尾随零的数量不是 n/5 而是 n/5 + n/5/5。经过一番思考,我们可以看到,一般来说,n! 的尾随零的数量!是 n/5 + n/5/5 + n/5/5/5 + n/5 /5/5/5 + ...,在项达到零的地方结束。
如果您的程序在 n / 5j 不为零而不是 n 模 5j 为零,它会计算这个总和。您的程序与此计算的相似性使我怀疑这是意图。如果是这样,请将这些行更改为:
for (j = 1; 0 < n; j++)
{
n /= 5;
sum = sum + n;
}
(为了简单起见,我这样表述,但我们也可以看到,如果 n 0 < n 到 5 <= n。)
此外,读取新的n 时不会重置总和。在第一个for循环之前删除sum的声明,并在第一个for之后和second之前插入int sum = 0;。
一般来说,最好不要在需要之前声明它们。因此,从main 的顶部删除n 的声明,并将其放在第一个for 之后。在for循环之前删除i和j的声明,并在其for循环中定义每一个:for (int i = 0; i < t; i++)和for (int j = 1; 5 <= n; j++)。
在cout << sum; 中,您可能需要换行符:cout << sum << '\n'; 或cout << sum << std::endl;。
Do not include <bits/stdc++.h>. 而是包含标准标头,例如此程序的<iostream>。
避免使用using namespace std;。在你的代码中使用std::(例如,std::cin而不是cin),即使它需要更多的输入或者选择性地从命名空间中获取一些特定的东西,例如using std::cin;整个命名空间。虽然这最初需要更多的工作,但它避免了程序并训练您更好地了解您的程序正在使用什么。