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 }