问题遇到的现象和发生背景
给定一个数,请将该数各个位上数字反转得到一个新数。
这次与 NOIp2011 普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。整数反转是将所有数位对调;小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分;分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母;百分数的分子一定是整数,百分数只改变数字部分。整数新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零;小数新数的末尾不为 00(除非小数部分除了 00 没有别的数,那么只保留1个 00);分数不约分,分子和分母都不是小数(约分滴童鞋抱歉了,不能过哦。输入数据保证分母不为 00),本次没有负数。
题目描述
给定一个数,请将该数各个位上数字反转得到一个新数。
这次与 NOIp2011 普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。
整数反转是将所有数位对调。
小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分。
分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母。
百分数的分子一定是整数,百分数只改变数字部分。
输入格式
一个实数 ss
输出格式
一个实数,即 ss 的反转数
用代码块功能插入代码,请勿粘贴截图
#include<stdio.h>
#include<string.h>
int main()
{
char a[10000];
gets(a);
int len = strlen(a);
int flag = 0,count=0,count2=0;
for (int i = 0; i < len; i++)
{
if (a[i] == '.') { flag = 1; count = i; break; }
else if (a[i] == '%') { flag = 2; count = i; break; }
else if (a[i] == '/') { flag = 3; count = i; break; }
else { flag = 0; }
}
int count1 = count + 1;
if (flag==1)
{
int j =count-1;
while (a[j]=='0')
{
j--;
}
for (int k =j; k >=0; k--)
{
putchar(a[k]);
}
printf(".");
for(int q=count+1;q<len;q++)
{
if (a[q] != '0')
{
count2 = 1;
break;
}
}
if (count2) {
j = len - 1;
while (a[j] == '0')
{
j--;
}
for (int k = j; k >= count1; k--)
{
putchar(a[k]);
}
}
if (count2 == 0)
putchar('0');
}
else if (flag==3)
{
int j = count-1;
while (a[j] == '0')
{
j--;
}
for (int k = j; k >= 0; k--)
{
/*printf("%c", a[k]);*/
putchar(a[k]);
}
printf("/");
j = len - 1;
while (a[j] == '0')
{
j--;
}
for (int k = j; k > count; k--)
{
/*printf("%c", a[k]);*/
putchar(a[k]);
}
/* return 0;*/
}
else if (flag==2)
{
int j = len - 2;
while (a[j] == '0')
{
j--;
}
for (int k = j; k >= 0; k--)
{
/*printf("%c", a[k]);*/
putchar(a[k]);
}
/*printf("%");*/
putchar(a[len - 1]);
/*return 0;*/
}
else if (flag == 0)
{
int i = len - 1;
while (a[i] == '0')
{
i--;
}
for (int j = i; j >= 0; j--)
{
/*printf("%c", a[j]);*/
putchar(a[j]);
}
}
return 0;
}