【发布时间】: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<<(((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<<endl; -
圣言蝙蝠侠。使用一些变量来存储它的不同部分怎么样?
-
我试过了,它似乎也不起作用。
-
重写它以使其可读不仅仅是让它工作(尽管它可能会有所帮助);这是为了让读者(包括您)更容易理解。
-
round()已经返回long long为什么要显式地将其转换为该类型?让它更难读?
标签: c++ function gcc compiler-errors g++