返回错误数据类型的C++函数
在下面的代码中,该轮似乎返回了错误的数据类型值。当我删除else语句第50行中的所有长类型转换时,编译器抛出的错误表明了这一点。 原因可能是什么 编译期间遇到的错误:- ||==生成文件:无项目编译器中无目标:未知===| C:\Users\MUNNU\Desktop\KBIGNUMB.cpp | |在函数“int main”中:| C:\Users\MUNNU\Desktop\KBIGNUMB.cpp | 50 |错误:“double”和“double”类型的操作数对二进制“operator%”无效| ||==生成失败:1个错误,0个警告0分钟,0秒===| 程序代码:-返回错误数据类型的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%
#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。那么,我的程序应该工作正常。