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 

  • s是整数,不大于20位

  • s是小数,整数部分和小数部分均不大于10位

  • s是分数,分子和分母均不大于10位,数据分母保证不为0,不用约分

  • 对于所有部分而言,如果除了0没有别的数,那么只保留一个0,注意前导零也要去掉



 

来源/分类

//暴力法能用是能用,就是有点废人
#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿白|

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值