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

算法訓練:N 進制下的回文數迭代求解(C 語言實現)

     編輯:關於C語言

問題描述

給定進制 N (2≤N≤10 或 N=16) 與數 M,執行「反轉相加」迭代:

M = M + reverse(M)

若 30 步內得到回文數,輸出步數;否則輸出 "Impossible!"。

核心邏輯

  • 判斷回文:字符串首尾對稱比較。
  • 進制加法:逐位相加處理進位,N=16 時需處理 A-F。
  • 迭代上限 30 次。

C 語言實現(關鍵片段)

int is_palindrome(char *s, int len) {
    for (int i=0; i<len/2; i++)
        if (s[i] != s[len-i-1]) return 0;
    return 1;
}

void add_reverse(char *s, int base) {
    int len = strlen(s), carry = 0;
    char tmp[40];
    for (int i=0; i<len; i++) {
        int a = char_val(s[i]);
        int b = char_val(s[len-1-i]);
        int sum = a + b + carry;
        carry = sum / base;
        tmp[i] = val_char(sum % base);
    }
    if (carry) tmp[len++] = val_char(carry);
    tmp[len] = '\0';
    reverse(tmp);
    strcpy(s, tmp);
}

int main() {
    int N; char M[40];
    scanf("%d%s", &N, M);
    for (int step=0; step<=30; step++) {
        if (is_palindrome(M, strlen(M))) {
            printf("STEP=%d\n", step);
            return 0;
        }
        add_reverse(M, N);
    }
    printf("Impossible!\n");
    return 0;
}

測試樣例

輸入:
9
87
輸出:
STEP=6
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved