java例题_13 加上100再加上168的完全平方数问题

 1 /*13 【程序 13 根据条件求数字】 
 2 题目:一个整数,它加上 100 后是一个完全平方数,再加上 268 又是一个完全平方数,请问该数是多少? 
 3 程序分析:在 10万以内判断,先将该数加上 100 后再开方,再将该数加上 268 后再开方,如果开方后的结果满足如下条件,即是结果。 
 4 */
 5 
 6 //=============百度到开方的方法
 7 //以下是java.lang.Math.sqrt()方法的声明
 8 //  public static double sqrt(double a)——————括号里面是double类型
 9 
10 /*分析1
11  * 遍历0~10w,先找到加上100能完全开方的数,再判定这些数里面是否满足再加上156能完全开方======不对!
12  * */
13 
14 /*=============查资料后思考如下==================*/
15 /*分析2
16  * 此题的问题不是怎么遍历相加再开方,关键是怎么知道一个浮点数是一个完全平方数!
17  * 换个角度,因为浮点数取值有限,所有开方再平方会出现误差,而完全平方数不会有这个误差
18  * 所以方法如下:
19  * 1、将(i+100)开方、(i+268)开方
20  * 2、再讲开方后的结果平方,强制转换为整型再与i比较------【注】:为了减小误差,这里将两个数都夸大10w倍后再强制转换--long型
21  * 3、如果相等,则是满足条件
22 */
23 
24 
25 package homework;
26 
27 public class _13____ {
28 
29     public static void main(String[] args) {
30         //A,B表示开方后的数
31         long A,B,C;
32         //遍历0~10w的数
33         for (int i = 0; i <=100000; i++) {
34             A=(long) (Math.sqrt(i+100)*10000);  //根号a*10000
35             B=(long) (Math.sqrt(i+268)*10000);  //根号b*10000
36             C=(long) (Math.sqrt((i+100)*(i+268))*10000*10000);   //根号a*10000*根号b*10000=根号(a*b)*10000*10000
37 //            System.out.println(i+"\t"+C+"\t"+B*A);
38             if (C==A*B) {
39                 System.out.print(i+" ");
40             }
41 //            System.out.println(C+"\t"+B*A);
42 //            if(((i+100)*100000==(int)(A*A*100000))&((i+168)*100000==(int)(B*B*100000))) {
43 //                System.out.print(i+" ");
44 //                System.out.println((i+100)*100000+"\t"+(int)(A*A*100000)+"\t"+(i+168)*100000+"\t"+(int)(B*B*100000));
45 //            }
46         }
47 
48     }
49 
50 }

 

posted @ 2020-02-12 22:23  浪漫主义程序员  阅读(327)  评论(0编辑  收藏  举报