返回十进制值的Long int类型函数
long long int type function returning decimal value
我写了一段代码,它将返回给定整数的平方根(不含小数点,即平方根的底数)。但是当我调用它的时候,它给了我一个十进制的值。为什么会发生这种情况?下面是代码'
#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;
}
}
问题的原因在其他答案中已经被正确识别,但解决方案并不令人满意。您希望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;
}
}
您可能在这里得到std::sqrt
而不是您定义的::sqrt
。根据您正在使用的c++实现,将sqrt
调用限定为::sqrt
可能有效。更好的做法是,将您的自定义sqrt
命名为其他名称,并直接调用它。
-
Microsoft以间接包含
<cmath>
头的方式实现了<iostream>
头。 -
这不是一个bug, c++标准并没有规定禁止在STL头文件中间接包含其他STL头文件
-
因此,这个间接包含的标题
<cmath>
遮蔽了您的sqrt
。 -
在Clang或GCC等其他编译器中,您不会遇到这样的行为
解决方案:
- 将
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;
}
}
相关文章:
- 为什么 int 类型的枚举类值不能用作 int
- 如何将文本文件的特定行读取到 int 类型的数组中C++?
- int* 和 int[] 类型对二进制运算符 + 的操作数无效
- 比较两个整数在C++中与未知 int 类型的相等性
- 二进制'operator+' 'int*'和'int*'类型的无效操作数
- 使用元编程选择 int 类型,将生成错误
- 从数组创建 Mat 时,'cv::Mat' 和 'int' 类型不兼容
- 复制初始化 - 从 'int' 类型转换为非标量类型
- 初始化cv :: mat ::具有int类型的定义大小的人
- 处理代码重新定义int类型(uint16_t,int16_t等),并不喜欢它
- 为什么没有"int"类型声明时输出不同?
- 在大型程序中将长变量更改为 int 类型
- 无法将 int 类型转换为时间类型(我的类类型)
- C++:无法在按位函数后将 int 类型设置为非标量
- 无法分配给INT类型的成员[10]
- C++ cin 将字符串读取到 int 类型中返回 0
- 为什么 decltype((i)) 是引用类型,而 decltype(i+0) 是 int 类型
- 使用4用于循环的4矩阵上的数组下标的“ int [int]类型”
- std::is_arithmetic 为通用 lambda 中的 int 类型返回 false:未定义的行为?
- 正在施放带有“ Int”类型的临时性