魔術方陣輸出時, 固定欄寬與不固定欄寬有甚麼差別呢?
這是未固定欄寬的5*5魔術方塊:
15 8 1 24 17
16 14 7 5 23
22 20 13 6 4
3 21 19 12 10
9 2 25 18 11
這是固定欄寬的5*5魔術方塊:(整齊許多)
15 8 1 24 17
16 14 7 5 23
22 20 13 6 4
3 21 19 12 10
9 2 25 18 11
注意:選用"固定寬度"的字體 (如:Consolas) 才能排列整齊 (非固定寬度的英文字體,如此網頁的 i, k (i 較窄、k較寬) 會無法對齊!!
----------------------------------------------------------------------------
下面是利用某固定的欄寬, 輸出不定長字串的程式碼例子 ( by C++ Builder):
void PrintSquare(int n)
{ int i, j, k;
String row, space ;
int len = IntToStr(n*n).Length()+2;
// 欄寬長度設為比 n*n 數字的位數多 2
for (i = 0; i < n; i++)
{ row = "";
for (j = 0; j < n; j++)
{ space = len - IntToStr(square[i][j]).Length();
// 數字前的空格數 = 欄寬 - 數字的字元數
for (k = 0; k < space; k++) row += " ";
// 在 s 字串前先預放 space 偌多的空格
row += IntToStr(square[i][j]);
// 將代表數字的字串, 接在 row 字串之後
}
Form1->Memo1->Lines->Add(row);
}
}
===============
產生 n*n 的魔術方塊, 並輸出在 listBox1 中:
// ===== 印出對齊的矩陣數字 (by VisualStudio C++) =====
String^ data_str = "";
int block_len = Convert::ToString(n*n)->Length+2;
// block_len 即存放那"固定欄寬"的長度, 目前設為比 n*n 數字的位數多2
int blank_len = 0;
for (i=0; i<n; i++)
{ s = ""; // 清空字串 s
for (j=0; j<n; j++)
{ data_str = Convert::ToString(square[i][j]);
// square 為魔術方塊矩陣; square[i][j] 是該魔術數字
blank_len = block_len - data_str->Length;
// 數字前的空格數 = 欄寬 - 數字的字元數
for (k=0; k<blank_len; k++) s += " ";
// 在 s 字串前先預放 blank_len 偌多的空格
s += data_str; // 將代表數字的字串, 接在 s 字串之後
}
listBox1->Items->Add(s);
}