如果输入的数字不是一个完美的正方形,找到最近的完美正方形?

时间:2011-05-19 06:55:52

标签: c++

#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;
}

我希望我所做的检查完美的方块是可以的,但我还想 如果输入的数字不是一个完美的正方形,找出最接近完美正方形的数字 任何想法

8 个答案:

答案 0 :(得分:11)

实际上,这是更好的答案:

int number = 13;
int iRoot = static_cast<int>(sqrt(static_cast<float>(number)) + .5f);

你不需要在天花板或地板之间检查更大,做一个简单的循环就可以了。

sqrt(13)是3.6,当你添加.5强制转换为4. sqrt(12)是3.46并且当你添加.5强制转换为3.(我们试图舍入,这就是我们添加.5的原因。 )。正如你所看到的,当数字更接近更高的根时,它会给你一个大于.5的小数;当数字更接近较低值的根时,小数小于.5,就这么简单!

答案 1 :(得分:5)

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

float root = sqrt((float)number);
int floor = (int)root;
int ceil = floor + 1

然后检查哪个距离ceil * ceilfloor * floor更近。

答案 2 :(得分:3)

平方根旁边的整数。

答案 3 :(得分:2)

r成为int(sqrt(double(number))+0.5)。然后,您需要检查(r-1)*(r-1)r*r(r+1)*(r+1)中的哪一个距number最近。就是这样。

答案 4 :(得分:1)

你需要找出两个2的幂:(int)sqrt((float)number)((int)sqrt((float)number)+1),(用d1,d2表示)并找出m in{|number-d1|,|number-d2|}
另外,为了提高性能,我会将float sqrt((float)number)缓存为变量并使用它(而不是再次计算sqrt())

答案 5 :(得分:1)

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

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

并将其连续应用于用户指定数字上下的整数。

int delta=1;
int perfectSquare = 0;
bool perfectSquareFound = false;
while(!perfectSquareFound)
{
   int above = number+delta;
   int below = number-delta;
   float aboveSquareRoot = sqrt((float)above);
   float belowSquareRoot = sqrt((float)below);
   if( (int)aboveSquareRoot == aboveSquareRoot )
   {
      perfectSquareFound = true;
      perfectSquare = above;
   }
   else if( (int)belowSquareRoot == belowSquareRoot )
   {
      perfectSquareFound = true;
      perfectSquare = below;
   }
}

答案 6 :(得分:0)

这是我的答案

int main()
{

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

答案 7 :(得分:-1)

应该像(伪代码),

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;