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;
}
标签:int,反转,ZZULIOJ,2890,++,low2,&&,res 来源: https://blog.csdn.net/bairimeng16/article/details/122398106