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 }