首页新闻找找看学习计划

《C语言算法竞赛入门经典》的一道题

0
悬赏园豆:5 [已解决问题] 解决于 2014-01-16 14:08

题目要求:输出所有aabb型四位完全平方数。

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int a,b;
double m,n;
for(int a=1;a=9;a++)
for(int b=0;b<=9;b++)
{
n=a*1100+b*11;
m=sqrt(n);
if(floor(m+0.5)==m)
cout<<n<<endl;

}
}

 

问题一:以下代码在VS上运行不出来啊。

问题二:书上说floor(m+0.5)是因为浮点数m不精确会有误差.可是如果“floor(m+0.5)==m”  ==右侧的m不精确,本来就不是整数,不就不能相等了吗?

初学,请赐教,谢谢!

C c++
Neverland1995的主页 Neverland1995 | 初学一级 | 园豆:200
提问于:2014-01-16 09:58
< >
分享
最佳答案
1

首先,你的这一段代码

for(int a=1;a=9;a++)

问题很大,a=9?a <= 9吧!如果按你这样写的话a=9永远为非零值,程序陷入死循环了

其次,的确判断double类型的数据不能简单地用==符号

应该是abs(a-b) < 1e-8之类的

不过按照你的程序,恰好m=88.000000时floor(m+0.5) == m 成立,事实上也只有这一个数满足题意。

PS:我突然想到,为什么不能反过来做呢?输出使它本身的平方成为AABB式的那个数行么?

收获园豆:5
飞鸟_Asuka | 菜鸟二级 |园豆:251 | 2014-01-16 10:54

谢谢,a改成<=9就有结果了。另外从1000~9999枚举的方法是可以的,是书上给出的另一种解法。

我只是不知道,浮点数什么时候需要考虑不准确的问题呢?我把m输出是88(我的编译器上,88后面还没有小数),感觉也没有问题···不用floor(m+0.5)这么复杂啊。我现在就是不知道精度对解题到底有没有影响,比如(float)a/b==2会不会出错

Neverland1995 | 园豆:200 (初学一级) | 2014-01-16 11:19

@Neverland1995: 浮点数永远不能精确的表示一个数学上的小数。学过计算机组成原理的话你就会知道浮点数在计算机中是如何表示的,你可以查下相关资料。

精度对解题的影响看题意了,你的这道题事实上也可以不用浮点数。主要是sqrt函数会造成浮点数的问题,因此我前面才说“反过来做”,从n=10~n=99一个一个枚举过来,如果平方运算后的数满足AABB形式则输出n。这样可以避免浮点数的精度问题。

飞鸟_Asuka | 园豆:251 (菜鸟二级) | 2014-01-16 11:33
其他回答(2)
0

平方数比较少,我觉得你应该列出位于范围内的平方数,然后一个一个观察是不是符合要求比较好。

就是:

for(i=sqrt(1000); i < sqrt(10000); i++)

if (i*i match aabb pattern) then output i*i;

 

     

hoodlum1980 | 园豆:543 (小虾三级) | 2014-07-23 10:12
0

for(i=31;i<100;i++)
{
  temp = i*i;
  a1 = temp%10;
  a2 = temp/10%10;
  if(a1!=a2)
  {
    continue;
  }
  b1 = temp/100%10;
  b2 = temp/1000;
  if(b1==b2)
  {
    printf("num is : %d\n",temp);
  }
}

这个解法行不

warnet | 园豆:202 (菜鸟二级) | 2014-07-23 13:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册