其他分享
首页 > 其他分享> > ZZULIOJ:2890: 数字反转

ZZULIOJ:2890: 数字反转

作者:互联网

2890: 数字反转

时间限制: 1 Sec  内存限制: 128 MB
提交: 632  解决: 77
[状态] [讨论版] [提交] [命题人:541907010414]

题目描述

大嘴猫吃完金币,玩完卡牌之后心满意足,OH很是嫉妒,于是强迫大嘴猫完成以下任务:

给大嘴猫一个数(整数、小数、分数),让它找出该数的反转。

输入

一个非负数 s。 

输出

一个数,即 s 的反转数。

样例输入 Copy

20220109

样例输出 Copy

90102202

提示

样例2:
输入:14.00
输出:41.0
样例3:
输入:13/14
输出:31/41 



 

来源/分类

//暴力法能用是能用,就是有点废人
#include<stdio.h>
#include<string.h>
int main() {
    char s[101] = { 0 };
    char res[101] = { 0 };
    int z = 0, x = 0, f = 0;
    int k = 0, j = 0, t;
    scanf("%s", s);//原数组
    if (strcmp(s, "0") == 0) {//特殊情况0
        printf("0");
        return 0;
    }
    int lon = strlen(s);
    for (int i = 0; i < lon; i++) {//处理前导0
        if (s[i] == '0' && k == 0) continue;
        else if (s[i] != 0 && k == 0) k = 1;
        res[j++] = s[i];//处理后的数组放进去
    }
    int relon = strlen(res);//处理后的数组长度
    for (int i = 0; i < relon; i++) {
        if (res[i] == '.') {//看是不是小数
            x = 1, z = 1;
            t = i;//记录小数点位置
            break;
        }
        if (res[i] == '/') {//同理
            f = 1, z = 1;
            t = i;
            break;
        }
    }
    char low1[101] = { 0 }, low2[101] = { 0 };//不是整数的话储存要翻转的两部分
    int h = t - 1;
    k = 0;
    if (z == 0) {//是整数,反着输出
        for (int i = relon - 1; i >= 0; i--) {
            if (res[i] == '0' && k == 0) continue;
            else if (res[i] != 0 && k == 0) k = 1;//去除翻转后的前导0
            printf("%c", res[i]);
        }
    }
    else {//不是整数
        for (int i = 0; i < t; i++) {
            low1[h--] = res[i];//倒着储存小数点或除号左边
        }
        h = 0, k = 0;
        int sum = 0;
        for (int i = relon - 1; i >= t + 1; i--) {
            if (res[i] == '0' && k == 0) {
                continue;
            }
            else if (res[i] != 0 && k == 0) {
                k = 1;
            }//去除后面多余的0
            low2[h++] = res[i];//倒着储存小数点或除号右边
            sum += res[i] - '0';//看小数点右边是不是0
        }
        if ((res[0] == '.' || res[0] == '/') && sum == 0) {//如果小数点两边都为0或者分子为零(处理前导零的时候会把所有0都处理掉)
            printf("0.0");
            return 0;
        }
        char ch;
        //看是小数还是分数
        if (x == 1) ch = '.';
        else if (f == 1) ch = '/';
        char low3[101] = { 0 };
        j = 0, k = 0;
        int lowlon = strlen(low1);
        for (int i = 0; i < lowlon; i++) {//再次处理前导0
            if (low1[i] == '0' && k == 0)
                continue;
            else if (low1[i] != 0 && k == 0)
                k = 1;
            low3[j++] = low1[i];
        }
        if (sum == 0) {//题目要求如果全是0只保留1个0
            memset(low2, 0, sizeof(low2));
            low2[0] = '0';
        }
        int lonlow2 = strlen(low2);
        int u = lonlow2 - 1;
        if (lonlow2 != 1) {
            while (low2[u] == '0') {
                low2[u] = '\0';
                u--;
            }
        }
        if (res[0] == '.' || res[0] == '/') printf("0");
        printf("%s%c%s", low3, ch, low2);
    }
    return 0;
}

标签:int,反转,ZZULIOJ,2890,++,low2,&&,res
来源: https://blog.csdn.net/bairimeng16/article/details/122398106