算法 之 aabb

题目描述:输出所有形如aabb的4位完全平方数(即前两位数字相等,后两位数字也相等)。

分支和循环结合在一起时功能强大:

下面列举所有可能的结果aabb,然后判断它们是否为完全平方数。注意a的范围是1~9,但b可以是0.

1  for(int a=1;a<=9;a++)
2      for(int b=0;b<=9;b++)
3         If(aabb是完全平方数)
4                printf(“%d\n”,aabb);                       

上面的程序并不完整——“aabb是完全平方数”是中文描述,而不是合法的C语言表达式,而aabb在C语言中也是另外一个变量,而不是把两个数字a和b拼在一起。这个把这样“不是真正程序”的“代码”成为伪代码(pseudocode)。虽然有一些正规的伪代码的定义,但在实际应用中,并不需要太拘泥于为代码的格式。主要的目标是描述算法梗概,避开细节,启发思路。

写出伪代码之后,我们需要考虑如何把它变成真正的代码。上面的伪代码有两个“非法”的地方;完全平方数判定,以及aabb这个变量。后者相对比较容易;用另外一个变量n=a×1100+b×11存储即可。

接下来的问题就要困难一些了:如何判断n是否为完全平方数?

方法一:PS(floor(x),也写做Floor(x),其功能是“向下取整”,或者说“向下舍入”,即取不大于x的最大整数)

 1 #include<stdio.h>
 2 #include<math.h>
 3 int main()
 4 {
 5    for(int a=1;a<=9;a++)
 6       for(int b=0;b<=9;b++)
 7       {
 8        int n=a*1100+b*11;//这里开始使用n,因此在这里定义n
 9        int m=floor(sqrt(n)+0.5);
10        if(m*m==n)
11         printf("%d\n",n);
12       }
13    return 0;
14 }  

可不可以这样写?If(sqrt(n)==floor(sqrt(n))) printf(“%d\n”,n);即直接判断sqrt(n)是否为整数。理论上当然没问题,但这样写不保险,因为浮点数的运算(和函数)有可能存在误差。假设在经过大量计算后,由于误差的影响,整数1变成了0.99999999,floor的结果会是0而不是1,。为了减少误差的影响,一般改成四舍五入,即floor(x+0.5)。如果难以理解,可以想象在数轴上把一个单位区间左移0.5个单元的距离。

Floor(x)等于1的区间为【1,2】,而floor(x+0.5)等于1的区间为【0.5,1.5】.

  浮点运算可能存在误差。再进行浮点运算比较时,应考虑到浮点误差。

  总结:小数部分为0.5的数也会受到浮点误差的影响,因此任何一道严密的算法竞赛题目都需要想办法解决这个问题

另一思路是枚举平方根x,从而避免开方操作。

#include<stdio.h>
int main()
{
   for(int x=1;;x++)     //for循环没有指定循环条件  如果期待你从32开始可以不用判断1000
   {
      int n=x*x;      if(n<1000) continue;
      if(n>9999)  break;
      int high=n/100;
      int low=n%100;
      if(high/10==high%10&&low/10==low%10)
     printf("%d\n",n);
   }
   return 0;
} 

答案为

.

原文地址:https://www.cnblogs.com/lzhh/p/acm_n0.html

时间: 2024-10-14 08:49:10

算法 之 aabb的相关文章

游戏碰撞之OBB算法实现(java代码实现)

公司业务需求 游戏2D模型有圆形和矩形,判断碰撞说白了就是检测 : 1.圆形跟圆形是否有相交 2.圆形跟矩形是否相交 3.矩形和矩形是否相交 先明白要实现的原理,才能有思路写代码 第1个最好判断,判断两个圆中心点的矩形是否小于这两个圆的半径之和 第2个纠结了我一下,不过也不难先看图圆跟矩形关系有4种情况,如下图 只要判断圆心到矩形4条边的距离都小于圆的半径或者圆心在矩形内则它们相交,还要判断圆心在矩形内是防止出现上面第四张图那样的特殊情况 圆心到边的距离有如下两种情况 两个箭头表示点到线段的距离

基于cocos2d-x的跑酷游戏项目教程

Cocos2d-x跑酷游戏项目教程 Cocos2d-x跑酷游戏项目教程 cocos2d-x特性 cocos2d-x采用MVC三层架构 流程控制( flow control ):方便管理不同的场景之间的流程 精灵(Sprite) 方便快速的显示控制一切可见的元素 节点(Node) 采用树状的继承关系,方便管理不同层次的游戏元素 动作( Action) 应用于节点的各种动画效果,动作元素 特效,平面地图,菜单,用户输入,文档,MIT许可,基于OpenGL的深度优化 简单跑酷游戏项目内容: 1.模型,

基于 Mathematica 的机器人仿真环境(机械臂篇)[转]

完美的教程,没有之一,收藏学习. 目的 本文手把手教你在 Mathematica 软件中搭建机器人的仿真环境,具体包括以下内容(所使用的版本是 Mathematica 11.1,更早的版本可能缺少某些函数,所以请使用最新版.[email protected]).  1 导入机械臂的三维模型  2 (正/逆)运动学仿真  3 碰撞检测  4 轨迹规划  5 (正/逆)动力学仿真  6 控制方法的验证  不妨先看几个例子: 逆运动学 双臂协作搬运 显示运动痕迹 (平移)零空间运动  无论你是从事机器

3D空间中射线与轴向包围盒AABB的交叉检测算法

引言 在上一节中,我讲述了如何实现射线与三角形的交叉检测算法.但是,我们应该知道,在游戏开发中,一个模型有很多的三角形构成,如果要对所有的物体,所有的三角形进行这种检测,就算现在的计算机运算能力,也是无法高效的完成.所以,我们需要通过其他的手段来提早剔除一些不可能发生交叉的物体,这种早退的思想,大量的运用在3D游戏技术中.在本篇文章中,我将像大家讲述如何实现射线与轴向包围盒AABB的交叉检测.如果读者不明白什么是轴向包围盒,请看这篇文章. Ray-AABB交叉检测算法 现如今,有很多的Ray-A

3D空间中射线与轴向包围盒AABB的交叉检测算法【转】

引言 在上一节中,我讲述了如何实现射线与三角形的交叉检测算法.但是,我们应该知道,在游戏开发中,一个模型有很多的三角形构成,如果要对所有的物体,所有的三角形进行这种检测,就算现在的计算机运算能力,也是无法高效的完成.所以,我们需要通过其他的手段来提早剔除一些不可能发生交叉的物体,这种早退的思想,大量的运用在3D游戏技术中.在本篇文章中,我将像大家讲述如何实现射线与轴向包围盒AABB的交叉检测.如果读者不明白什么是轴向包围盒,请看这篇文章. Ray-AABB交叉检测算法 现如今,有很多的Ray-A

Cocos2d-x教程(33)-三维物体AABB碰撞检测算法

欢迎加入Cocos2d-x 交流群:193411763 转载时请注明原文出处 :http://blog.csdn.net/u012945598/article/details/38870705 ---------------------------------------------------------------------------------------------------------------------------------------------------------

3D空间中射线与轴向包围盒AABB的交叉检测算法 【转】

http://blog.csdn.net/i_dovelemon/article/details/38342739 引言 在上一节中,我讲述了如何实现射线与三角形的交叉检测算法. 但是,我们应该知道,在游戏开发中,一个模型有很多的三角形构成,如果要对所有的物体,所有的三角形进行这种检测,就算现在的计算机运算能力,也是无法高 效的完成.所以,我们需要通过其他的手段来提早剔除一些不可能发生交叉的物体,这种早退的思想,大量的运用在3D游戏技术中.在本篇文章中,我将像大家讲 述如何实现射线与轴向包围盒A

[算法][包围盒]球,AABB,OBB

参考地址请看图片水印:http://www.cnblogs.com/iamzhanglei/archive/2012/06/07/2539751.html http://blog.sina.com.cn/s/blog_6a1bf1310101g7zy.html 包围体是一个简单的几何空间,里面包含着复杂形状的物体.为物体添加包围体的目的是快速的进行碰撞检测或者进行精确的碰撞检测之前进行过滤(即当包围体碰撞,才进行精确碰撞检测和处理).包围体类型包括球体.轴对齐包围盒(AABB).有向包围盒(OB

浅谈Manacher算法与扩展KMP之间的联系

首先,在谈到Manacher算法之前,我们先来看一个小问题:给定一个字符串S,求该字符串的最长回文子串的长度.对于该问题的求解,网上解法颇多,时间复杂度也不尽相同,这里列述几种常见的解法. 解法一 通过枚举S的子串,然后判断该子串是否为回文,由于S的子串个数大约为,加上每次判断需要的时间,所以总的时间复杂度为,空间复杂度为. bool check(string &S, int left, int right) { while (left < right && S[left]