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;
}
}
}
答案 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
。最后,您在其中两个部分之间执行模运算,这是不受支持的。