C++ 如果输入的数字不是完美平方,是否查找最近的完美平方? #包括 #包括 #包括 使用名称空间std; int main() { 整数; 数量; 不能对根旁边的整数求平方。

C++ 如果输入的数字不是完美平方,是否查找最近的完美平方? #包括 #包括 #包括 使用名称空间std; int main() { 整数; 数量; 不能对根旁边的整数求平方。,c++,C++,你需要找出二的二次幂:(int)sqrt((float)number)和((int)sqrt((float)number)+1)(用d1,d2表示),然后在{number-d1 |,{number-d2 |中找出m。 另外,为了提高性能,我会将floatsqrt((float)number)缓存为一个变量,并使用它(而不是再次计算sqrt())使用相同的检查来查看一个数字是否是一个完美的正方形: if((int)sqrt((float)number)==sqrt((float)number))

你需要找出二的二次幂:
(int)sqrt((float)number)
((int)sqrt((float)number)+1)
(用d1,d2表示),然后在{number-d1 |,{number-d2 |中找出m


另外,为了提高性能,我会将float
sqrt((float)number)
缓存为一个变量,并使用它(而不是再次计算sqrt())

使用相同的检查来查看一个数字是否是一个完美的正方形:

if((int)sqrt((float)number)==sqrt((float)number))

并将其依次应用于用户指定数字上方和下方的整数

#include <iostream>
#include <limits>
#include <cmath>

using namespace std;

int main()
{
    int number;
    cout << "Enter the number whose sqare root needs to be calculated";
    cin >> number;
    cout << "Square root of " << number << " is " << (int)sqrt((float)number)  << " OR " << sqrt((float)number) << endl;
    if( (int)sqrt((float)number) == sqrt((float)number) )
    cout << "The number is a perfect sqaure";
    else
    cout << "The number is not a perfect square";
    //To find the nearest perfect square if the number entered
   // is not a perfect square?

    return 0;
}

r
成为
int(sqrt(double(number))+0.5)
。然后您需要检查
(r-1)*(r-1)
r*r
(r+1)*(r+1)
中的哪一个最接近
数字
。仅此而已。

应该类似于(psuedo代码)

intsqrtvalue=(int)sqrt((float)number);//存储在临时值中
int lowerPerfectSquare=pow(sqrtValue,2);
int higerPerfectSquare=pow(sqrtValue+1,2);
int nearPerfectSquare=(高完美Square-数字)<(数字-低完美Square)?
sqrtValue+1:sqrtValue;

首先查找根的地板和天花板:

int sqrtValue = (int)sqrt((float)number);  // store in a temporary value
int lowerPerfectSquare = pow(sqrtValue, 2);
int higerPerfectSquare = pow(sqrtValue + 1, 2);
int nearPerfectSquare = (higerPerfectSquare - number) < (number - lowerPerfectSquare)?
                        sqrtValue + 1 : sqrtValue;

然后只需检查
ceil*ceil
floor*floor

实际上,下面是更好的答案:

float root = sqrt((float)number);
int floor = (int)root;
int ceil = floor + 1
int number=13;
int iRoot=静态施法(sqrt(静态施法(数字))+0.5f);
你不需要检查天花板和地板之间的距离,做一个简单的圆就可以了

sqrt(13)是3.6,当你将.5次强制转换添加到4时,sqrt(12)是3.46,当你将.5次强制转换添加到3时。(我们正在尝试四舍五入,这就是我们添加.5次强制转换的原因).如您所见,当数字接近较大的根时,它将给您一个大于.5的小数点;当数字接近较小的根时,小数点小于.5,就这么简单!

这是我的答案

int number = 13;
int iRoot = static_cast<int>(sqrt(static_cast<float>(number)) + .5f);
intmain()
{
长整型n,ans;
cin>>n;
ans=圆形(sqrt(n));

你为什么要计算两次
sqrt
?这是计算小于数字的最大完美平方,而不是最接近的。这是一种效率极低的方法。你已经将两次乘法和一个最大值转化为可能的数千次迭代!我完全同意!这确实是一种效率非常低的方法。@munish:这是一种将t四舍五入的方法o是最接近的整数,但在这种情况下,您并不想这样做,因为它需要您测试三个数字,而不是两个。这个答案接近于一个好答案,但是您不需要做任何检查,r的原始解决方案可以通过添加.5来工作(请参阅我的答案,基本上是相同的,仅举一个例子).实际上,有一种更快的方法,请查看我的答案!+1以减少比较的次数-尽管Veredesmarld的解决方案对于那些以后必须维护代码的人来说可能更容易理解!可能应该使用
double
而不是
float
,但是,它更可能能够精确地设置
int
@leetnighshade的所有值,这似乎是一个很好的技巧…进入it@leetNightshade:平方根可以具有大于.5的分数部分,并且仍然更接近较小的完美平方,例如,对于380.3(sqrt=19.501…)你的方法返回的是400而不是361。我认为你的方法适用于所有整数输入。是的,取小数点的平方根似乎有问题。取.25的平方根是.5,而.5是.7。因此,对于小数点,你可以做一些不同的事情,尽管你仍然可以做类似的技巧,我想。我还没有明白n要完全测试这个,但我想你可能可以这样做:float number=380.499;int iRoot=static_cast(sqrt(static_cast(static_cast)(number+.5f))+.5f);我很确定有更好的方法,但我现在有一个考试要担心。所以,让我知道你的想法!
int number = 13;
int iRoot = static_cast<int>(sqrt(static_cast<float>(number)) + .5f);
int main()
{

    long long int n, ans;
    cin >> n;
    ans = round(sqrt(n));
    cout << ans<< endl;
}