九九乘法Code
2013/09/28 14:04九九乘法表是很常見的作業,常常出現在剛講完迴圈的時候讓大家練習一下
我們先來看看這個最基本的C語言版本:
#include <stdio.h>
int main () {
int i, j;
for (i = 1; i <= 9; i++)
for (j = 1; j <= 9; j++)
printf("%d x %d = %2d%s", i, j, i * j, j == 9 ? "\n" : ", ");
return 0;
}
這是VB
Dim i As Integer, j As Integer
Dim output As String
For i = 1 To 9
For j = 1 To 9
Dim v As Integer
v = i * j
output = output & CStr(i) & " * " & CStr(j) & IIf(v < 10, " = ", " = ") & CStr(v) & IIf(j = 9, vbNewLine, ""))
Next
Next
Print output
這是Java
public class J99 {
public static void main(String[] args) {
for (int i = 1; i <= 9; i++)
for (int j = 1; j <= 9; j++)
System.out.printf("%d x %d = %2d%s", i, j, i * j, j == 9 ? "\n" : ", ");
}
}
這是Python
for i in range(1, 10):
output = ""
for j in range(1, 10):
output = output + "%d x %d = %2d%s" % (i, j, i * j, j == 9 and "" or ", ")
print output
但是這麼簡單的Code絕對不是我們今天的重點 XD 今天的重點是:怎麼把簡單的九九乘法表變得很難懂、很複雜
首先來看一下我昨天寫的Python一行九九乘法
print "".join(map(lambda i: "".join(map(lambda j: "%d x %d = %2d%s" % (i, j, i * j, j == 9 and "\n" or ", "), range(1, 10))), range(1, 10)))
原理大概就是map + range取代迴圈,str.join(list)來連接字串,加上lambda function不用換行
程式禁區 社團內有人提供的混亂 C++ 版本 (看起來明明是 C ,為什麼會說是 C++ 呢?因為 C 裡面並沒有定義 true 喔!)
#include <stdio.h>
int oO(int o, int O) {
if(!o) return O;
return oO((o & O) << 0x1L/~-2, o ^ O);
}
int main() {
int Sum = 1e0, False = true, Cat, Dog;
while(1e1 > Sum) {
Cat = !False;
Dog = False & Cat;
while(Dog < False) {
Cat = oO(Sum, Cat);
Dog = oO(Dog, !(Cat ^ Cat));
}
if(False) {
printf("%d%c%d=", False, 0x2A, Sum);
}
else {
printf("%d%c%d=%2d", Cat, (char)False, Dog, Sum);
}
if(0xA > Cat) {
putchar(040U);
}
else {
Dog = Cat;
}
printf("%d", Cat);
if(011U == False) {
Sum = oO(Sum, 1e0);
False = true;
putchar(0xA);
}
else {
False = oO(true, False);
putchar(0x20L);
}
}
return 0;
}
接下來是 Takeshi 寫的一行C版本,運用了printf的ret value(spec ref)
#include<stdio.h>
int main(){
return printf("%dx%d=%d\n", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\n", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\n", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\n", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\n", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\n", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\n", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\n", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\n", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", printf("%dx%d=%d\t", 1, 1, 1)-5, 2, 2)-5, 3, 3)-5, 4, 4)-5, 5, 5)-5, 6, 6)-5, 7, 7)-5, 8, 8)-5, 9, 9)-4, 1, 2)-4, 2, 4)-4, 3, 6)-4, 4, 8)-4, 5, 10)-5, 6, 12)-5, 7, 14)-5, 8, 16)-5, 9, 18)-4, 1, 3)-3, 2, 6)-3, 3, 9)-3, 4, 12)-4, 5, 15)-4, 6, 18)-4, 7, 21)-4, 8, 24)-4, 9, 27)-3, 1, 4)-2, 2, 8)-2, 3, 12)-3, 4, 16)-3, 5, 20)-3, 6, 24)-3, 7, 28)-3, 8, 32)-3, 9, 36)-2, 1, 5)-1, 2, 10)-2, 3, 15)-2, 4, 20)-2, 5, 25)-2, 6, 30)-2, 7, 35)-2, 8, 40)-2, 9, 45)-1, 1, 6)-0, 2, 12)-1, 3, 18)-1, 4, 24)-1, 5, 30)-1, 6, 36)-1, 7, 42)-1, 8, 48)-1, 9, 54)+0, 1, 7)+1, 2, 14)+0, 3, 21)+0, 4, 28)+0, 5, 35)+0, 6, 42)+0, 7, 49)+0, 8, 56)+0, 9, 63)+1, 1, 8)+2, 2, 16)+1, 3, 24)+1, 4, 32)+1, 5, 40)+1, 6, 48)+1, 7, 56)+1, 8, 64)+1, 9, 72)+2, 1, 9)+3, 2, 18)+2, 3, 27)+2, 4, 36)+2, 5, 45)+2, 6, 54)+2, 7, 63)+2, 8, 72)+2, 9, 81);
}
這是大神 Morris 寫的遞迴版本
#include <stdio.h>
void n99(int x, int y) {
if(y < 1 && x > 1) n99(x-1, 9);
if(x > 0 && y > 0) {
n99(x, y - 1);
printf("%d x %d = %2d%s", x, y, x * y, y == 9 ? "\n" : ", ");
}
}
int main() {
n99(9, 9);
return 0;
}
大概解釋一下: 透過遞迴實作,從最後面(9x9)開始往前,但是因為遞迴具有Stack的特性,所以會讓輸出順序反轉回來
這個版本最簡短,直接透過 main() 自身做遞迴
#include <stdio.h>
int main(int a){return (a++<82)&&printf("%d*%d=%d\n",(a-2)/9+1,(a-2)%9+1,(a-2)+1)&&main(a+1);}
再來看看這個超級WTF厲害的C XDD(自豪
#include <stdio.h>
#define $ "%d x %d = %2d%s"
#define $_$ printf
#define $_$_$ return
#define $_$_$_$ "\n"
#define $_$_$_$_$ ", "
#define $_$_$_$_$_$ main
#define $_$_$_$_$_$_$ for
#define $_$_$_$_$_$_$_$ int
#define $_$_$_$_$_$_$_$_$ <=
#define $_$_$_$_$_$_$_$_$_$ ++
#define $_$_$_$_$_$_$_$_$_$_$ ==
#define $_$_$_$_$_$_$_$_$_$_$_$ =
#define $_$_$_$_$_$_$_$_$_$_$_$_$ )
#define $_$_$_$_$_$_$_$_$_$_$_$_$_$ 0
#define $_$_$_$_$_$_$_$_$_$_$_$_$_$_$ 1
#define $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ 9
#define $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ {
#define $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ }
#define $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ i
#define $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ *
#define $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ j
#define $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ ?
#define $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ ,
#define $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ :
#define $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ ;
#define $_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$ (
$_$_$_$_$_$_$_$
$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$
$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$_$
其實只是透過
#define
這個marco去帶換而已 :P