返回十进制值的Long int类型函数

long long int type function returning decimal value

本文关键字:int 类型 函数 Long 十进制 返回      更新时间:2023-10-16

我写了一段代码,它将返回给定整数的平方根(不含小数点,即平方根的底数)。但是当我调用它的时候,它给了我一个十进制的值。为什么会发生这种情况?下面是代码'

#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等其他编译器中,您不会遇到这样的行为

解决方案:

  1. sqrt函数放在单独的命名空间中(例如mymath)。
  2. 在代码中调用你的函数作为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;
  }
}