加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

输出所有形如aabb的四位完全平方数(即前两位数字相等,后两位数字也相等)

(2012-07-10 09:23:31)
标签:

杂谈

分类: 计算机学习
 一.思路1: 
 
    该题的大体思路是十分清晰的,即" 循环 + if "的搭档进行筛选.  
 
    具体点说就是通过2重循环将所有aabb数列举出来,再通过if来筛选出是完全平方数的数. 
   
    下面是我写的代码:
#include<stdio.h> 
int main()
{
     int number,m,n,p,q,i;
     for(number=1000; number<=9999; number++)
     {
          q=number;//个位上的数
          p=number/10;//十位上的数
          n=number/100;//百位上的数
          m =number/1000;//千位上的数
          if(m==n&&q==p)
          {
               for(i=32; i<100; i++)
                   if(i*i==number)
                   printf("%d",number);
           }
           else
                continue;
      }
      return 0;
 }
下面是算法入门经典的代码:

01.#include<stdio.h>  
02.#include<math.h>  
03.int main()  
04.{  
05.   int i,j,m;  
06.   float n;  
07.   for(i = 1; i <= 9; i++)  
08.   for(j = 0; j <= 9; j++)  
09.   {  
10.      m = 1100*i + 11*j;  
11.      n = sqrt(m);  
12.      if(floor(n + 0.5) == n)  
13.      printf("%d/n",m);       
14.   }  
15.   return 0;  
16.}  
 实现:
 
 这里提到了一个常用的功能实现: 如何判断一个数是否是整数的问题.
 
 原始的思路是利用floor(x)来取x的整数部分,再与x相比较,如果二者相等,则x是整数,反之则不是.
 
 这里需要注意的一个问题是float型数据的精度问题,在大量计算中,由于float型对于无限小数的运算也是属于近似运算,所以存在一定的误差,很容易出现的问题是:原本结果是1的,得出的结果却是0.999999999.然而floor之后却变成了0,显然这是不正确的.因此需要处理这种由精度引起的误差问题.
 
书中给出的方法是+0.5.这样就能很巧妙地避开上述的错误.原因如下:
 
 i) 当x是整数时,加上0.5后变成x.5,再用floor处理后,仍然是x.可判断相等
 
 ii)当x是小数时,加上0.5后再经过floor后变成整数,可判断不相等
 
 iii)当x是类似于0.99999999的小数时,加上0.5后经过floor变成1,可判断相等
 
 这里需要指出的一点是if判定相等的问题.当比较0.9999999与1时,会判定不相等.
 
 当比较0.9999999与1时,会判定相等.(编译器是MinGW3.4.5) 
 
 即判断一个数x是否是整数的表达式: if(floor(x + 0.5) == x)
 
二.思路2
 
         前面的思路是先将aabb形式的数列举出来,再用完全平方这个条件筛选.当然,我们
 
         也可以先将一些数的完全平方计算出来,再判断是不是aabb型的数. 二者顺序不同,结果一样.

01.#include<stdio.h>  
02.int main()  
03.{  
04.   int x,n,hi,lo;  
05.   for(x = 1; ; x++)  
06.   {  
07.      n = x * x;  
08.      if(n < 1000) continue;  
09.      if(n > 9999) break;  
10.      hi = n / 100;  
11.      lo = n % 100;  
12.      if(hi/10 == hi && lo/10 == lo)  
13.        printf("%d/n",n);     
14.   }  
15.  return 0;  
16.}  
 
   这段代码用到了我们平常编程比较少用到的continue语句,由continue和break组成的判断
 
   组合可以做类似的定界判断.也可以好好体会下这种用法.

0

阅读 收藏 喜欢 打印举报/Report
前一篇:C语言printf
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有