輸入兩整數 A, B (1~9999),輸出格狀乘法過程表格。格式極其嚴格:邊框、對角線、數字對齊、積的拆分、最終結果環繞顯示。多測試用例,0 0 結束。
#include
#include
int a[10], b[10], c[20];
int lenA, lenB, lenC;
int main() {
int A, B;
while (scanf("%d%d", &A, &B) == 2 && (A || B)) {
int C = A * B;
lenA = lenB = lenC = 0;
while (A) { a[++lenA] = A % 10; A /= 10; }
while (B) { b[++lenB] = B % 10; B /= 10; }
while (C) { c[++lenC] = C % 10; C /= 10; }
// 逆序使 a[1] 為最高位
for (int i = 1, j = lenA; i < j; ++i, --j) { int t = a[i]; a[i] = a[j]; a[j] = t; }
for (int i = 1, j = lenB; i < j; ++i, --j) { int t = b[i]; b[i] = b[j]; b[j] = t; }
for (int i = 1, j = lenC; i < j; ++i, --j) { int t = c[i]; c[i] = c[j]; c[j] = t; }
// 輸出頂部邊框
printf("+-");
for (int i = 1; i <= lenA; ++i) printf("----");
printf("--+\n");
// 輸出 A
printf("| ");
for (int i = 1; i <= lenA; ++i) printf("%d ", a[i]);
printf(" |\n");
// 輸出格狀主體
for (int row = 1; row <= lenB; ++row) {
printf("| +");
for (int i = 1; i <= lenA; ++i) printf("---+");
printf(" |\n");
// 十位行
printf("| |");
for (int col = 1; col <= lenA; ++col)
printf("%d /|", (a[col] * b[row]) / 10);
printf(" |\n");
// 對角線行
printf("| |");
for (int col = 1; col <= lenA; ++col) printf(" / |");
printf("%d|\n", b[row]);
// 個位行
printf("|%d|", (row == lenB && lenC > lenA) ? c[lenC - lenA] : ' ');
for (int col = 1; col <= lenA; ++col)
printf("/ %d|", (a[col] * b[row]) % 10);
printf(" |\n");
}
// 底部邊框
printf("| +");
for (int i = 1; i <= lenA; ++i) printf("---+");
printf(" |\n");
// 結果行
printf("|");
if (lenC > lenA) printf("/");
else printf(" ");
for (int i = lenC; i >= 1; --i) {
printf(" %d ", c[i]);
if (i > 1) printf("/");
}
printf(" |\n");
// 最底邊框
printf("+-");
for (int i = 1; i <= lenA; ++i) printf("----");
printf("--+\n");
}
return 0;
}