使用scala打印九九乘法表,可以有多種實現方法,實現的過程充分的體現的scala語言的優勢和巨大的簡潔性和高效性,
下面我用了5種方法實現九九乘法表。
使用類似於java,c++等指令風格的的編程實現,源碼如下:
//這里打印倒向九九乘法口訣表 /*指令風格的編程實現九九乘法表*/ def printMultiTable() { var i = 1 //這里只有i在作用范圍內 while (i <= 9) { var j = i //這里只有i和j在作用范圍內 while (j <= 9) { val prod = (i * j).toString() //這里只有i和j和prod在作用范圍內 var k = prod.length() //這里只有i和j和prod和k在作用范圍內 while (k < 4) { print(" ") k += 1 } print(i + "*" + j + "=" + prod) j += 1 } // i和j讓在作用范圍內,但是k已經不在作用范圍內。 println() i += 1 } //i仍在范圍內,j,prod,和k脫離了范圍 }
執行的結果如下:
1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9
2*2=4 2*3=6 2*4=8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18
3*3=9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27
4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36
5*5=25 5*6=30 5*7=35 5*8=40 5*9=45
6*6=36 6*7=42 6*8=48 6*9=54
7*7=49 7*8=56 7*9=63
8*8=64 8*9=72
9*9=81
發現是倒向的乘法口訣,
下面我們修改代碼打印一個正向的九九乘法表,關鍵在while(j <=i) 這個條件。
/** * 打印正向的九九乘法表 */ def printMultiTable2() { var i = 1 //這里只有i在作用范圍內 while (i <= 9) { var j = 1 //這里只有i和j在作用范圍內 while (j <= i) { val prod = (i * j).toString() //這里只有i和j和prod在作用范圍內 var k = prod.length() //這里只有i和j和prod和k在作用范圍內 while (k < 4) { print(" ") k += 1 } print(j + "*" + i + "=" + prod) j += 1 } // i和j讓在作用范圍內,但是k已經不在作用范圍內。 println() i += 1 } //i仍在范圍內,j,prod,和k脫離了范圍 }
執行結果如下:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
scala的語法簡潔性,和函數式的風格,我們可以使用函數風格實現該功能發現代碼量會減少很多,邏輯也更加清晰:
源碼如下:
//打印:打印乘法口訣發 def makeRowSeq(row: Int) = for (col <- 1 to row) yield { val prod = (row * col).toString() val padding = " " * (4 - prod.length()) col + "*" + row + "=" + prod + padding } def makeRow(row: Int) = makeRowSeq(row).mkString /*函數風格的編程實現九九乘法表*/ def multiTable() = { val tableSeq = for (row <- 1 to 9) yield makeRow(row) println(tableSeq.mkString("\n")) }
執行結果如下:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
使用scala的for循環嵌套的方式實現該功能,代碼可以更加簡潔,只需要5,6行代碼即可實現,
充分體現了scala的語言的強大性。
def multiTable2() = { for(row <- 1 to 9 ; col <- 1 to row){ val prod = (row * col).toString() val padding = " " * (4 - prod.length()) print(col + "*" + row + "=" + prod + padding) if(row == col) println() } }
執行結果如下:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
可以使用for嵌套循環和scala的s()方法,使實現更加簡單,scala果然博大精深,
源碼如下:
def multiTable3 = { ( for ( i <- 1 to 9; j <- 1 to i; ss = s"$j*$i=${i * j}\t" ) yield { if (j == i) s"$ss\n" else ss }).foreach(print); }
執行結果如下:
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81