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

给定一个数,请将该数各个位上数字反转得到一个新数。这次与 NOIp2011 普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。整数反转是将所有数位对调;小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分;分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母;百分数的分子一定是整数,百分数只改变数字部分。整数新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零;小数新数的末尾不为 0(除非小数部分除了 0 没有别的数,那么只保留 1 个 0);分数不约分,分子和分母都不是小数(约分滴童鞋抱歉了,不能过哦。输入数据保证分母不为 0),本次没有负数。

输入格式

一个数 s

输出格式

一个数,即 s 的反转数

输入输出样例

输入样例 #1:

5087462

输出样例 #1:

2647805

输入样例 #2:

600.084

输出样例 #2:

6.48

输入样例 #3:

700/27

输出样例 #3:

7/72

输入样例 #4:

8670%

输出样例 #4:

768%

说明

所有数据(20个数据):

25% s 是整数,不大于 20 位

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

25% s 是分数,分子和分母均不大于 10 位

25% s 是百分数,分子不大于 19 位


第一次居然就有 40 分,觉得这 20 个测试点真是太良心了,下了好几次测试点数据后笑容逐渐消失,幸好题做得多系统给我蓝名了哈哈哈哈哈哈哈

思路

头脑简单版本:整数直接从后往前逐个字符输出就行,小数分数从小数点或斜杠断开,前后两个整数分别倒着输出,百分数就是整数加个百分号而已。测试样例搞定后果断提交(这可是卧底潜入广东供液大学最大的收获「雾」)。

40 分就这样来的,马上下载了一个测试点输入数据,居然是 0.00000

那么同样的,说不定就会有 1001.00、100/100100、100.00100100、0、0% ……

0 毫无疑问地成了万恶之源,怎样处理 0 呢?

分数、整数、小数(整数部分)

将所有字符顺序调换之后,开头的 0 不输出,末尾的 0 要输出。必要时补 0。

flag2=0;
for (int j = i-1; j >= 0 ; j--)
{   
    if (a[j]=='0' && flag2==0) continue;
    else
    {
        flag2=1;
        b[j]=a[j]-'0';
        printf("%d",b[j]);
    } 
}
if (flag2==0) printf("0");

小数(小数部分)

将所有字符顺序调换之后,开头的 0 输出,末尾的 0 不输出。必要时补 0。

flag2=0;
for (int j = strlenA-1; j >= i+1 ; j--)
{   
    if (a[j] != '0')
    {
        flag2=1;
        b[j]=a[j]-'0';
        printf("%d",b[j]);
    }
    if (a[j] == '0')
    {
        flag3=0;
        for (int k = j; k >= i+1 ; k--)
        {
            if(a[k] != '0')
            {
                flag3=1;
                break;
            }
        }
        if(flag3==1) 
        {
            printf("0");
        }
        else continue;
    }
}
if (flag2==0) printf("0");

百分数

将所有字符顺序调换之后,跳过 % 号,再按上述方式输出,最后补个 % 号。必要时补 0。

for (int i = strlenA-2; i >= 0; i--)
{
    if(a[i]=='0' && flag2==0) continue;
    else
    {
        flag2=1; 
        b[i]=a[i]-'0';   
        printf("%d",b[i]);
    }
}
if (flag2==0) printf("0");
printf("%%");

最后

最后我是怎样 AC 的呢,不知道。但我知道所谓的屎山是怎么来的了。

#include <stdio.h>
#include <string.h>
char a[23];
int numtype=1,strlenA,flag=0,flag2=0,b[23],flag3;

void output(int i, int n)
{
    flag2=0;
    for (int j = i-1; j >= 0 ; j--)
    {   
        if (a[j]=='0' && flag2==0) continue;
        else
        {
            flag2=1;
            b[j]=a[j]-'0';
            printf("%d",b[j]);
        } 
    }
    if (flag2==0) printf("0");

    if (n==2) printf(".");
    else if (n==3) printf("/");

    flag2=0;
    if(n==2)
    {
        for (int j = strlenA-1; j >= i+1 ; j--)
        {   
            if (a[j] != '0')
            {
                flag2=1;
                b[j]=a[j]-'0';
                printf("%d",b[j]);
            }
            if (a[j] == '0')
            {
                flag3=0;
                for (int k = j; k >= i+1 ; k--)
                {
                    if(a[k] != '0')
                    {
                        flag3=1;
                        break;
                    }
                }
                if(flag3==1) 
                {
                    printf("0");
                }
                else continue;
            }

        }
        if (flag2==0) printf("0");
    }
    else if(n==3)
    {
        for (int j = strlenA-1; j >= i+1 ; j--)
        {   
            if (a[j]=='0' && flag2==0) continue;
            else
            {
                flag2=1;
                b[j]=a[j]-'0';
                printf("%d",b[j]);
            } 
        }
    }
}

int main(){
    gets(a);
    strlenA=strlen(a);
    for (int i = 0; i < strlenA; i++)
    {
        if (a[i]==46){
            flag=1;
            output(i,2);
            break;
        }
        if (a[i]==47){
            flag=1;
            output(i,3);
            break;
        }
        if (a[i]==37){
            flag=2;
            break;   
        }
    }
    if (flag == 0)
    {
        for (int i = strlenA-1; i >= 0; i--)
        {
            if(a[i]=='0' && flag2==0) continue;
            else
            {
                flag2=1; 
                b[i]=a[i]-'0';  
                printf("%d",b[i]);
            }
        }
        if (flag2==0) printf("0");
        
    }
    if(flag == 2)
    {
        for (int i = strlenA-2; i >= 0; i--)
        {
            if(a[i]=='0' && flag2==0) continue;
            else
            {
                flag2=1; 
                b[i]=a[i]-'0';   
                printf("%d",b[i]);
            }
        }
        if (flag2==0) printf("0");
        printf("%%");
    }
    return 0;
}