计划编号1 : 在给定范围 a 和 b ,其中 a < = b ,我想查找数字是否为一个完美的quare,如果是,那么打印它的根。因此,我写了以下代码:
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
using namespace std;
float squaredroot(int n) {
float low = 0.0, mid;
float high = (float)n+1;
while ((high-low) > 0.00001) {
mid = (low+high) / 2;
if (mid*mid < n) {
low = mid;
}
else {
high = mid;
}
}
return low;
}
int main() {
int a,b,i=0; cin>>a>>b;
float roo=0.0;
for(i=a;i<=b;i++){
roo=squaredroot(i);
if(floor(roo)==roo){
cout<<roo<<endl;
}
}
return 0;
}
对于给定的输入1 5
,输出应为2
。但是,上述程序没有打印任何值。
然而,当我尝试使用与上面提到的程序编号1相同的基本概念运行另一个程序时,它被完美地执行了。 以下程序的任务是检查输入是否是完美的正方形。如果是,则打印数字的根,否则打印&#34;不是完美的正方形!&#34;。以下是程序编号2 的代码:
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
using namespace std;
float squaredroot(int n) {
float low = 0.0, mid;
float high = (float)n+1;
while ((high-low) > 0.00001) {
mid = (low+high) / 2;
if (mid*mid < n) {
low = mid;
}
else {
high = mid;
}
}
return low;
}
int main() {
int a; cin>>a;
float roo=0.0;
roo=squaredroot(a);
if(floor(roo)==roo){
cout<<roo<<endl;
}
else{
cout<<"Not a perfect square!"<<endl;
}
return 0;
}
我无法在第一个程序中找到错误。请帮忙。
答案 0 :(得分:4)
不要乱用平方根函数,而是考虑这个:
因此,要优雅地解决您的问题,请执行以下操作:
#include <iostream>
using std::cout;
void print_perfect_square( int start, int end ) {
int x = 0, nthOdd = 1;
while ( x <= end ) {
if ( x >= start ) {
cout << x << " is a square and its root is "
<< nthOdd - 1 << '\n';
}
x += 2*nthOdd - 1;
++nthOdd;
}
}
int main() {
// it should find 9 and 16
print_perfect_square(6,17);
cout << '\n';
// it sholuld skip negatives
print_perfect_square(-10,5);
cout << '\n';
// it should print 25,36...
print_perfect_square(20,100);
return 0;
}
答案 1 :(得分:3)
正如Gyro Gearloose所说,问题是squaredroot(4)
返回1.99999809
,所以floor(roo)!=roo
。解决此问题的一种方法是将条件(floor(roo)==roo)
更改为(fabs(roo - floor(roo+0.5)) < 0.00001)
。请注意,我在函数0.00001
中使用了相同的squaredroot
。