首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

CSU 1561 (More) Multiplication:格狀乘法表格精確輸出格式化

     編輯:關於C++

問題描述

輸入兩整數 A, B (1~9999),輸出格狀乘法過程表格。格式極其嚴格:邊框、對角線、數字對齊、積的拆分、最終結果環繞顯示。多測試用例,0 0 結束。

核心邏輯:模擬手工乘法

  1. 分解 A, B 為數字數組 (低位在前)
  2. 計算每位乘積:`a[i] * b[j]` → 十位、個位
  3. 按對角線累加求最終積
  4. 按規範輸出表格:頂部 A、右側 B、格內十位/個位、底部結果

關鍵格式規則

  • 邊框:`+` `-` `|` `/`
  • 每格:左上十位、右下個位、對角線 `/`
  • 結果:個位在右下角,向左向上環繞,前導零不顯示,斜線不出現在最高位前
  • 寬度:A 位數決定列數,B 位數決定行數

完整代碼 (精簡版)


#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;
}

格式調試關鍵

  1. 字符精確:每個 `+ - | /` 空格位置必須與樣例完全一致
  2. 結果環繞:`lenC > lenA` 時左側有 `/` 和額外數字
  3. 前導零抑制:格內十位顯示 0 (如 04),但最終結果不顯示前導零
  4. 單行/單列特判:A 或 B 為 1 位數時邊框仍完整

複雜度

  • 時間:O(lenA × lenB) ≤ 16 操作
  • 空間:O(1)
  • 核心難點在格式化輸出而非算法
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved