一个数加上100是个完全平方数,再加上168又是一个完全平方数, (含优化)

来源:互联网 发布:mac系统idea下载git 编辑:程序博客网 时间:2024/05/16 15:24
  1. public class HisTime {  
  2.     public static void main(String[] args) {  
  3.         long startTime = System.currentTimeMillis();  
  4.         for (int i = 0; i < 100000; i++) {  
  5.             double x = Math.sqrt(i + 100);  
  6.             double y = Math.sqrt(i + 268);  
  7.             if (x == (int) x && y == (int) y) {  
  8.                 System.out.println("这个数是:" + i);  
  9.                 continue;  
  10.             }  
  11.         }  
  12.         long endTime = System.currentTimeMillis();  
  13.         System.out.println("time:" + (endTime - startTime));  
  14.     }  
  15. }  

当然,执行时间为:


虽然只有5ms,可是我看着这儿算法有点不对,怎么说呢,这应该是说用计算机用大量的数据强制算出来的,没体现出算法的优越性。想想应该有更简单实用的算法来计算这个值。

传递上演算过程吧,手写版。

这样我们就得到了m值的范围,当然这是一个方面。(区间为[11,83],写错了 大笑

然后,其实虽然Java的Math库提供了许多实用的API,个人觉得开方应该比平方的运算耗时,当然这在单独的少量数据时,感觉不明显。

自己的代码:

[html] view plain copy
 print?
  1. public class TestTime {  
  2.     public static void main(String[] args) {  
  3.         TestTime testTime = new TestTime();  
  4.         long startTime = System.currentTimeMillis();  
  5.         // 确定 m的值范围  
  6.         for (int i = 11; i <= 83; i++) {  
  7.             // 得到 x的值  
  8.             double x = testTime.testDataM(i);  
  9.             // 判断 n是否为整数  
  10.             if (testTime.testDataN(x)) {  
  11.                 System.out.println("这个数是:" + x);  
  12.             }  
  13.         }  
  14.         long endTime = System.currentTimeMillis();  
  15.         System.out.println("time:" + (endTime - startTime));  
  16.     }  
  17.   
  18.     // 判断该数值是否符合: x+100=m^2  
  19.     public double testDataM(double data) {  
  20.         // 求得: m^2  
  21.         double mPow = Math.pow(data, 2);  
  22.         // 获取x的值  
  23.         double value = mPow - 100;  
  24.         return value;  
  25.     }  
  26.   
  27.     // 判断该数值是否符合:x+100+186=n^2  
  28.     public boolean testDataN(double data) {  
  29.         // 获取:n^2  
  30.         double mPow = data + 100 + 168;  
  31.         // 对n 开方  
  32.         double value = Math.sqrt(mPow);  
  33.         // 判断 n开方后是否是整数  
  34.         if (value == (int) value) {  
  35.             return true;  
  36.         }  
  37.         return false;  
  38.     }  
  39. }  

这个代码多了几倍,呵呵。我写了注释的啦。

下面是执行的时间:


结果是1ms,性能提升很高,不是么??


1 0
原创粉丝点击