题解 | #[NOIP1999]回文数#
[NOIP1999]回文数
https://www.nowcoder.com/practice/a432eb24b3534c27bdd1377869886ebb
#include <stdio.h> #include <string.h> #include <stdlib.h> // Function to reverse a string void reverse_str(char* str) { int n = strlen(str); for (int i = 0; i < n / 2; i++) { char temp = str[i]; str[i] = str[n - 1 - i]; str[n - 1 - i] = temp; } } // Function to check if a string is a palindrome int is_palindrome(char* str) { int len = strlen(str); for (int i = 0; i < len / 2; i++) { if (str[i] != str[len - i - 1]) { return 0; // Not a palindrome } } return 1; // Is a palindrome } // Function to add two numbers in a given base and return the result as a string void add_reverse(char* num, int base, char* result) { char reversed[101]; strcpy(reversed, num); reverse_str(reversed); int carry = 0; int n = strlen(num); int sum = 0; int i = 0; // Initialize result to zero memset(result, 0, 101); // Adding reversed numbers for (i = 0; i < n; i++) { int digit1 = (num[n - i - 1] >= 'A') ? (num[n - i - 1] - 'A' + 10) : (num[n - i - 1] - '0'); int digit2 = (reversed[n - i - 1] >= 'A') ? (reversed[n - i - 1] - 'A' + 10) : (reversed[n - i - 1] - '0'); sum = digit1 + digit2 + carry; result[i] = (sum % base < 10) ? (sum % base + '0') : (sum % base - 10 + 'A'); carry = sum / base; } if (carry > 0) { result[i++] = (carry < 10) ? (carry + '0') : (carry - 10 + 'A'); } result[i] = '\0'; reverse_str(result); } int main() { int base; char num[101]; // Read base and number scanf("%d", &base); scanf("%s", num); char result[101] = ""; int step = 0; for (step = 0; step < 30; step++) { if (is_palindrome(num)) { printf("STEP=%d\n", step); return 0; } add_reverse(num, base, result); strcpy(num, result); } printf("Impossible!\n"); return 0; }