【问题标题】:Invalid operand of types 'long long int' to binary 'operator%'“long long int”类型到二进制“operator%”的操作数无效
【发布时间】:2015-12-30 20:43:09
【问题描述】:

我在 C++ 中,我收到此错误:

bool comprovarCodi(long long num, int DC){
bool codi_correcte;
int i=0, suma_senars=0, suma_parells=0, suma_total=0, desena_superior, DC_calculat, cont=0;
while(num!=0){
    num=num/10;
    cont++;
    i++;    
}
if(cont==12){
    for(int j=1; j<12; j=j+2){
        suma_senars=suma_senars+num%pow(10,j);

我不知道为什么,我相信“num”是一个整数,所以我可以使用运算符“%”。

有人知道为什么会失败吗?

谢谢

【问题讨论】:

  • pow 返回double,您不能将% 应用于long longdouble
  • 您需要阅读整个错误信息,而不是只阅读一半。
  • (float 和 long double 也存在 pow,但是是的,没有整数返回类型)
  • 问题是我需要获取 12 位数字中的每个数字。这就是我使用长长的原因。你知道另一种方法吗?
  • @user3894819 很多人已经说过了,问题不是long long,而是double(pow)

标签: c++ int long-long


【解决方案1】:

不要将pow 用于此类事情。

long long pow_ten = 10;
for(int j=1; j<12; j=j+2)
{
   suma_senars=suma_senars+num%pow_ten;
   pow_ten *= 100;
}

这不仅会更快,而且还会正确计算,而不是 pow,后者可能会使用 exp(log(x) * y) 之类的东西来计算 x ** y - 因此并不总是能准确得出您想要的数字 - 特别是如果你把它转换回整数。

【讨论】:

    【解决方案2】:

    你必须先转换为 int
    suma_senars = suma_senars + num % (int)pow(10,j);
    更好的: suma_senars += num % (int)pow(10,j);
    更清楚: suma_senars += num % ( (int)pow(10,j) );

    【讨论】:

    • 实际上,我认为您的更清晰的行不如您的更好的行那么清晰——多余的括号通常会使 IMO 更难阅读。
    • 这是个坏主意,因为切割浮动部分很容易得到意想不到的结果。 (int)9.99999,而不是 10。一般来说,正如@Mats所说,在这种情况下不要使用pow
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 2018-10-23
    • 2022-07-22
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多