C ++函数返回错误的数据类型

时间:2017-02-09 20:07:24

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

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

编译时遇到的错误: -

  

|| ===构建文件:"没有目标" in"没有项目" (编译:​​未知)=== |
  C:\ Users \ MUNNU \ Desktop \ KBIGNUMB.cpp ||在功能' int main()':|
  C:\ Users \ MUNNU \ Desktop \ KBIGNUMB.cpp | 50 |错误:类型无效的操作数' double'和' double'二进制'运算符%' |
  || ===构建失败: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;
        }
    }
}

2 个答案:

答案 0 :(得分:3)

当您通过双重调用致电round()时,您实际上会致电:

double round(double x);

来自<cmath>而不是您的版本因此错误。如果你重命名你的函数错误将会没有强制转换。避免using namespace std的另一个原因。

答案 1 :(得分:2)

错误信息非常清楚。

  

错误:类型为'double'和'double'的操作数无效,为二元'运算符%'

没有为双打定义模运算。

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