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

返回错误数据类型的C++函数,c++,function,gcc,compiler-errors,g++,C++,Function,Gcc,Compiler Errors,G++,在下面的代码中,该轮似乎返回了错误的数据类型值。当我删除else语句第50行中的所有长类型转换时,编译器抛出的错误表明了这一点。 原因可能是什么 编译期间遇到的错误:- ||==生成文件:无项目编译器中无目标:未知===| C:\Users\MUNNU\Desktop\KBIGNUMB.cpp | |在函数“int main”中:| C:\Users\MUNNU\Desktop\KBIGNUMB.cpp | 50 |错误:“double”和“double”类型的操作数对二进制“operator%

在下面的代码中,该轮似乎返回了错误的数据类型值。当我删除else语句第50行中的所有长类型转换时,编译器抛出的错误表明了这一点。 原因可能是什么

编译期间遇到的错误:-

||==生成文件:无项目编译器中无目标:未知===| 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;
        }
    }
}

错误信息非常清楚

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

未为双精度运算定义模运算

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

当您使用double agrument调用时,您实际上调用:

double round(double x);

从不是你的版本,因此错误。如果你重新命名你的函数,错误将消失,没有强制转换。避免使用名称空间标准的另一个原因。

将其分解为可读的coutHoly表达式batman。如何使用一些变量来存储它的不同部分?我试过了,但它似乎也不起作用。重写它以使其可读不仅是为了让它工作,尽管它可能会有所帮助;这是为了让包括您在内的读者更容易理解。round已经返回long long为什么要显式地将其转换为该类型?让它更不可读?这很难理解,但是每次调用pow都是作为参数进行的,它返回一个整数类型。这个答案是完全错误的。我知道这一点,这就是为什么我使用该轮将pow返回的double转换为long-long。@shubhamavasti轮返回与其参数相同的类型,而不是long-long。lround和llround返回integers.Ha。还有一个不使用命名空间std;的原因;。第一次都没看到@Shubhamavasti如果放弃使用名称空间std会发生什么;然后将所有对pow的调用更改为std::pow?我不知道std::round返回双精度。我以为它会返回一个int。那么,我的程序应该工作正常。明白了。我认为std::round返回一个int。那么,我的程序应该工作正常。