【问题标题】:C++ function returning wrong data typeC++ 函数返回错误的数据类型
【发布时间】:2017-02-09 20:07:24
【问题描述】:

round() 似乎在以下代码中返回了错误的数据类型值。当我在第 50 行(else 语句)中删除所有 long long casts 时,编译器抛出的错误可以明显看出这一点。 可能是什么原因?

编译时遇到的错误:-

||=== 构建文件:“无项目”中的“无目标”(编译器:未知)===|
C:\Users\MUNNU\Desktop\KBIGNUMB.cpp||在函数'int main()':|
C:\Users\MUNNU\Desktop\KBIGNUMB.cpp|50|错误:'double' 和 'double' 类型的无效操作数到二进制 'operator%'|
||=== 构建失败:1 个错误,0 个警告(0 分钟,0 秒)===|

程序代码:-

#include<iostream>
#include<cmath>
using namespace std;

long long modexp(long long n,long long p,long long m)
{
    if(p==0)
        return 1;
    else
    {
        long long z=modexp(n,p/2,m);
        if(p%2)
            return (((z*z+m)%m)*n+m)%m;
        else return (z*z+m)%m;
    }
}

long long round(long double a)
{

    long long z=((long long)(a+0.5));
    return z;
}

long long digits(long long a)
{
    long long c=0;
    while(a!=0)
    {
        a/=10;
        //cout<<a<<endl;
        c++;
    }
    return c;
}

int main()
{
    int t;
    cin>>t;
    long long a,n,m;
    for(register int i=0;i<t;i++)
    {
        cin>>a>>n>>m;
        //cout<<(long long)(((long long)((pow(100,n)-1)/99)%m)*(a%m))%m<<endl<<(pow(100,n)-1)/99<<endl<<(((100*100-1)/99)*a)%m<<endl<<'@'<<((long long)(pow(10,floor(log10(a*10)))+0.5)-1)<<'@'<<endl;
        if(a==0)
            cout<<0<<endl;
        else
        //cout<<"p"<<digits(11)<<'@';
        {
            long double y=pow(10,digits(a));
            long long x=(modexp(round(y),n,m*round(y-1))-1+(m*(long long)round(y-1)));
            cout<<(((a+m)%m)*(((x%(m*(long long)round(y-1)))/((long long)round(y-1))+m)%m)+m)%m<<endl;
        }
    }
}

【问题讨论】:

  • 把它分解成可读的东西cout&lt;&lt;(((a+m)%m)*((((modexp(round(pow(10,digits(a))),n,m*round(pow(10,digits(a))-1))-1+(m*(long long)round(pow(10,digits(a))-1)))%(m*(long long)round(pow(10,digits(a))-1)))/((long long)round(pow(10,digits(a)))-1)+m)%m)+m)%m&lt;&lt;endl;
  • 圣言蝙蝠侠。使用一些变量来存储它的不同部分怎么样?
  • 我试过了,它似乎也不起作用。
  • 重写它以使其可读不仅仅是让它工作(尽管它可能会有所帮助);这是为了让读者(包括您)更容易理解。
  • round() 已经返回 long long 为什么要显式地将其转换为该类型?让它更难读?

标签: c++ function gcc compiler-errors g++


【解决方案1】:

当您使用双重 agrument 调用 round() 时,您实际调用的是:

double round(double x);

来自&lt;cmath&gt; 不是您的版本,因此会出现错误。如果您重命名您的函数错误将消失而无需演员。避免using namespace std 的另一个原因。

【讨论】:

  • 明白。我认为 std::round() 返回一个整数。那么,我的程序应该可以正常运行了。
【解决方案2】:

错误信息很清楚。

错误:“double”和“double”类型的无效操作数到二进制“operator%”

没有为双精度定义模运算。

您的巨型表达式使用了仅处理浮点类型的std::pow。当您使用整数调用 std::pow 时,它会提升为浮点类型。结果也是浮点类型。然后,当对double 和整数的混合执行算术运算时,整数被提升为double(参见提升规则的this summary),因此结果也是double。这意味着,如果没有所有这些转换,该表达式的大部分将被视为double。最终,您在其中两个部分之间执行模运算,这是不受支持的。

【讨论】:

  • 很难阅读,但每次调用pow 都是作为round 的参数完成的,它确实返回一个整数类型。
  • 这个答案是完全错误的。我知道这就是为什么我使用 round() 将 pow() 返回的 double 转换为 long long。
  • @ShubhamAvasthi round 返回与其参数相同的类型,而不是 long longlroundllround 返回整数。
  • 哈。不使用using namespace std; 的又一个理由。第一次也没看到。 @ShubhamAvasthi 如果您摆脱 using namespace std; 并将所有对 pow 的呼叫更改为 std::pow,会发生什么?
  • 我不知道 std::round() 返回一个双精度值。我以为它会返回一个int。那么,我的程序应该可以正常运行了。
猜你喜欢
  • 1970-01-01
  • 2019-12-12
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 2011-06-07
相关资源
最近更新 更多