P1553 数字反转(升级版)题解

· · 题解

洛谷 P1553 数字反转(升级版)题解

思路分析

首先不能用 int,会溢出,所以只能用字符串处理。

核心思想:查找有无 /.%,然后分部反转字符串,对于整数部分去除前导 0,对于小数部分去除后导 0,最后拼接起来就行。

完整代码(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;
}