P1553 数字反转(升级版)题解
洛谷 P1553 数字反转(升级版)题解
思路分析
首先不能用 int,会溢出,所以只能用字符串处理。
核心思想:查找有无 /.%,然后分部反转字符串,对于整数部分去除前导
完整代码(c语言)
#include <stdio.h>
#include <string.h>
// 反转字符串
void reverseString(char *str) {
int len = strlen(str);
char tmp;
for (int i = 0; i < len / 2; i++) {
tmp = str[i];
str[i] = str[len - i - 1];
str[len - i - 1] = tmp;
}
}
//去除字符串的前导0
void removeLeadingZeros(char *str) {
int i;
for (i = 0; i < strlen(str) && str[i] == '0'; i++) {}
if (i != strlen(str)) { // 如果相等则是只有0的情况,不用管
char s[50];
strcpy(s, str + i);
strcpy(str, s);
}
}
//去除字符串的后导0
void removeTrailingZeros(char *str) {
int i;
for (i = strlen(str) - 1; i >= 0 && str[i] == '0'; i--) {}
if (i != -1) { // 如果相等则是只有0的情况,不用管
str[i + 1] = '\0';
}
}
int main() {
char s[50];
scanf("%s", s);
char *p;
char ans[50];
if ((p = strstr(s, "."))) {
*p = '\0'; // 分成了前后两个字符串
reverseString(s); // 反转前面的字符串
removeLeadingZeros(s); // 整数部分要去除前导0
reverseString(p + 1); // 反转后面的字符串
removeTrailingZeros(p + 1); // 小数部分要去除后导0
sprintf(ans, "%s.%s", s, p + 1); // 拼接两个字符串
} else if ((p = strstr(s, "/"))) {
*p = '\0';
reverseString(s);
removeLeadingZeros(s);
reverseString(p + 1);
removeLeadingZeros(p + 1);
sprintf(ans, "%s/%s", s, p + 1);
} else if ((p = strstr(s, "%"))) {
*p = '\0';
reverseString(s);
removeLeadingZeros(s);
sprintf(ans, "%s%%", s);
} else {
reverseString(s);
removeLeadingZeros(s);
sprintf(ans, "%s", s);
}
printf("%s\n", ans);
return 0;
}