C++ 返回十进制值的长整型函数
我写了一段代码,返回给定整数的平方根(不带小数点,即平方根的下限)。但当我调用它时,它给了我一个十进制值。为什么会发生这种情况?这是密码`C++ 返回十进制值的长整型函数,c++,floating-point,int,C++,Floating Point,Int,我写了一段代码,返回给定整数的平方根(不带小数点,即平方根的下限)。但当我调用它时,它给了我一个十进制值。为什么会发生这种情况?这是密码` #include<iostream> using namespace std; long long int sqrt(long long int a){ long long int upper = a,lower=0; long long int mid = 0; while (!(mid*mid >= a an
#include<iostream>
using namespace std;
long long int sqrt(long long int a){
long long int upper = a,lower=0;
long long int mid = 0;
while (!(mid*mid >= a and (mid-1)*(mid-1) < a)){
mid = (lower+upper)/2;
if(mid*mid > a){
upper = mid;
}
else if(mid*mid <= a){
lower = mid;
}
}
return mid;
}
int main(){
int a;
while(cin>>a){
cout<<sqrt(a)<<endl;
}
}
#包括
使用名称空间std;
长整型sqrt(长整型a){
长整型上限=a,下限=0;
长整型中=0;
而(!(mid*mid>=a和(mid-1)*(mid-1)a){
上=中;
}
否则如果(中*中>a){
CUT< P>你可能得到了<代码> STD::这里不是“<代码> >:Sqrt< /Cuth>你定义了。取决于你使用的C++实现,限定你的代码> Sqrt :调用为“代码>::”Sqrt 可以工作。更好的是,调用你的习惯<代码> Sqrt其他东西并直接调用它。 < p>你可能得到了c。ODE > Sd::Sqrt< /Cord>这里代替了::Sqrt您定义了。根据您正在使用的C++实现,限定您的<代码> Sqrt 调用为“代码>::SqRT可以工作。更好的是,调用您的自定义<代码> Sqrt其他的东西,直接调用它。UL>
Microsoft以间接包含
头的方式实现了
头
<>这不是一个bug,C++标准并不规定在STL头中间接包含其他STL头是不允许的。
因此,标题
的间接包含会影响sqrt
在其他编译器中,例如或您没有经历过这样的行为
解决方案:
将sqrt
函数放在单独的命名空间中(例如,mymath
)
在代码中以mymath::sqrt
的形式调用函数
#包括
名称空间mymath{
长整型sqrt(长整型a){
长整型上限=a;
长整型下限=0;
长整型中=0;
而(!(中*中>=a&(中-1)*(中-1)a){
上=中;
}否则如果(中*中>a){
标准::cout
- Microsoft以间接包含
头的方式实现了
头
<>这不是一个bug,C++标准并不规定在STL头中间接包含其他STL头是不允许的。
- 因此,标题
的间接包含会影响sqrt
- 在其他编译器中,例如或您没有经历过这样的行为
解决方案:
将sqrt
函数放在单独的命名空间中(例如,mymath
)
在代码中以mymath::sqrt
的形式调用函数
#包括
名称空间mymath{
长整型sqrt(长整型a){
长整型上限=a;
长整型下限=0;
长整型中=0;
而(!(中*中>=a&(中-1)*(中-1)a){
上=中;
}否则如果(中*中>a){
std::cout问题的原因已在其他答案中正确确定,但解决方案并不令人满意。您希望sqrt
(您自己的函数和命名空间std
中提供的函数)的所有重载都可用,并且不需要像mymath::sqrt
这样的任何范围解析
解决方案必须考虑函数调用
long long int sqrt(long long int); // your function
float sqrt(float); // from namespace std
double sqrt(double); // from namespace std
long double sqrt(long double); // from namespace std
double sqrt(integral_type); // from namespace std in C++11
由于您调用sqrt(int)
将选择最后一个重载(如果您使用C++11),否则将选择第三个重载。为了选择您自己的函数,您必须调用它:
int main(){
long long int a;
while(cin>>a) {
cout<<sqrt(a)<<endl;
}
}
intmain(){
长INTA;
而(cin>>a){
cout问题的原因已在其他答案中正确确定,但解决方案并不令人满意。您希望sqrt
(您自己的函数和命名空间std
中提供的函数)的所有重载都可用,并且不需要像mymath::sqrt
这样的任何范围解析
解决方案必须考虑函数调用
long long int sqrt(long long int); // your function
float sqrt(float); // from namespace std
double sqrt(double); // from namespace std
long double sqrt(long double); // from namespace std
double sqrt(integral_type); // from namespace std in C++11
由于您调用sqrt(int)
将选择最后一个重载(如果您使用C++11),否则将选择第三个重载。为了选择您自己的函数,您必须调用它:
int main(){
long long int a;
while(cin>>a) {
cout<<sqrt(a)<<endl;
}
}
intmain(){
长INTA;
而(cin>>a){
coutI刚刚用g++4.8运行了你的代码,但没有看到这种行为。它似乎也是上限而不是下限,这可能取决于
是否因为某种原因包含
,这取决于实现。@haccks你的答案总是无效的。此外,这是一个键入错误。1)将sqrt
放在命名空间中(例如,mynamespace
),2)将mid
初始化为正确的初始值。3)调用函数,如mynamespace::sqrt
。我刚刚用g++4.8运行了您的代码,但没有看到这种行为。它似乎也是上限而不是下限,这可能取决于
是否出于某种原因包括
,这取决于实现。@检查您的答案始终无效。此外,这是一个键入错误。1)将sqrt
放在命名空间中(例如,mynamespace
),2)将mid
初始化为正确的初始值。3)调用函数,如mynamespace::sqrt
。