1   package demo.d1;
2   
3   /**
4    * Lasketaan mitkä kokonaisluvut ovat jonkin luvun neliöitä.
5    * @author Vesa Lappalainen
6    * @version 1.0, 10.01.2003
7    * <pre>
8    * Aluksi mietitään miten arvot käyttäytyvät
9    *   n  sqrt(n)
10   *   0    0
11   *   1    1
12   *   2    1.4...
13   *   3    1.7...
14   *   4    2
15   *   5    2.2...
16   *   6    2.4...
17   *   7    2.6...
18   *   8    2.8...
19   *   9    3
20   * 
21   *  Eli oikeastaan kannattaakin lukuja käydä lävitse tuolla
22   *  neliöjuuripuolella...  Silloin niiden neliöt ovat ne halutut
23   *  kokonaisluvut.
24   * </pre>
25   */
26  public class Koksqrt {
27  
28      private static void tulosta(int n1, int n2) {
29          System.out.println(" " + n1 + " => " + n2);
30      }
31  
32  
33      //-------------------------------------------------------------------------
34      private static void tulostaNeliojuuret1(int raja) {
35          // Matemaatikon versio
36          int n = 0, ns = 0;
37          while (n <= raja) {
38              tulosta(n,ns);
39              ns++;
40              n = ns * ns;
41          }
42      }
43  
44  
45      //-------------------------------------------------------------------------
46      private static void tulostaNeliojuuret2(int raja) {
47          // "Raakavoimaratkaisu"
48          int ns,n = 0;
49          double dns;
50          while (n <= raja) {
51              dns = Math.sqrt(n);
52              ns = (int)Math.round(dns);
53              if ( dns == ns)
54                  tulosta(n,ns);
55              n++;
56          }
57      }
58  
59  
60      //-------------------------------------------------------------------------
61      private static void tulostaNeliojuuret3(int r) {
62          // "Hakkerin" ratkaisu
63          for (int i=0,j=0;i<r;++j,i=j*j) System.out.println(" "+i+" => "+j);
64      }
65  
66  
67      //-------------------------------------------------------------------------
68      private static void tulostaNeliojuuret4(int raja) { // NOPMD rajaa ei käytetä
69          // M$ ratkaisu, jossa päätetty että 100 riittää :-)
70          tulosta(0,0);
71          tulosta(1,1);
72          tulosta(4,2);
73          tulosta(9,3);
74          tulosta(16,4);
75          tulosta(25,5);
76          tulosta(36,6);
77          tulosta(49,7);
78          tulosta(64,8);
79          tulosta(80,9); // Kuuluu M$-ratkaisuun, korjataan ver 3.5 :-)
80          tulosta(100,10);
81      }
82  
83  
84      /**
85       * Testataan eri versioita laskennasta
86       * @param args ei käytössä
87       */
88      public static void main(String[] args) {
89          tulostaNeliojuuret1(1000);
90          tulostaNeliojuuret2(1000);
91          tulostaNeliojuuret3(1000);
92          tulostaNeliojuuret4(1000);
93      }
94  
95  }
96