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