题解 | #[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;
}
查看16道真题和解析
