給定進制 N (2≤N≤10 或 N=16) 與數 M,執行「反轉相加」迭代:
M = M + reverse(M)
若 30 步內得到回文數,輸出步數;否則輸出 "Impossible!"。
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