我写了一段代码,它将返回平方根(没有小数位,即平方根的底面)给定一个整数。但是,当我打电话给它时,它给了我一个小数值。为什么会发生这种情况?这是代码`
#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;
}
}
答案 0 :(得分:3)
您可能会在此处std::sqrt
而不是您定义的::sqrt
。根据您正在使用的C ++实现,将sqrt
调用视为::sqrt
可能会有效。更好的是,将您的自定义sqrt
称为其他内容并直接调用它。
答案 1 :(得分:3)
在其他答案中已正确识别出问题的原因,但解决方案并不令人满意。您希望sqrt
(您自己的函数和namespace 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;
}
}
答案 2 :(得分:2)
Microsoft以间接包含<iostream>
标题的方式实施了<cmath>
标头。
这不是错误,C ++标准并未规定禁止在STL标头中间接包含其他STL标头。
因此,标题<cmath>
的间接包含会影响您的sqrt
。
sqrt
函数放在单独的命名空间中(例如mymath
)。 mymath::sqrt
。#include<iostream>
namespace mymath {
long long int sqrt(long long int a) {
long long int upper = a;
long long int lower = 0;
long long int mid = 0;
while (!(mid * mid >= a && (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 (std::cin >> a){
std::cout << mymath::sqrt(a) << std::endl;
}
}