#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;
}
我希望我所做的检查完美的方块是可以的,但我还想 如果输入的数字不是一个完美的正方形,找出最接近完美正方形的数字 任何想法
答案 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 * ceil
和floor * 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;