permui / ZJUCKC-C-Learning-Assistence

浙江大学竺可桢学院C语言程序设计辅学计划公共仓库。
6 stars 6 forks source link

[practice]3-卢芳民-洛谷P1553 数字反转(升级版) #6

Open Lu-fm opened 4 years ago

Lu-fm commented 4 years ago

[有3个点一直过不了,求debug] https://www.luogu.com.cn/problem/P1553

//数字反转,包括分数,小数,百分数;
#include<stdio.h>
#include<string.h>
int k = 0;
int judge(char s[]);
void turnover(char s[], int n);
int main()
{
    char s[25],t[25]="0";
    int a,i=0,j=0,b;
    scanf("%s", s);
    while(s[k]!='\0')
        k++;
    a=judge(s);
    turnover(s, a);
    turnover(s + a + 1, k-a-1);
    while (s[i] == '0' )
        i++;
    if(s[a]=='.'||s[a]=='%')
    {
        while(s[k-1]=='0')
            k--;
        for (j = i; j < k;j++)
            t[j-i] = s[j];
        printf("%s", t);
    }
    else if(s[a]=='/')
    {
        b = a+1;
        while( s[b]=='0')
            b++;
        for (j = i; j <= a;j++)
            t[j - i] = s[j];
        for (j = a-i+1; j < k;j++)
            t[j] = s[b + j - a +i-1];
            printf("%s", t);
    }
    else 
    {
        for (j = i; j <k;j++)
            t[j - i] = s[j];
        printf("%s", t);
    }
    return 0;
}

int judge(char s[]){
    int flag=k, i = 0;
    while(*(s+i)!='\0')
    {
        if(*(s+i)=='/'||*(s+i)=='.'||*(s+i)=='%')
        {
            flag = i;
            break;
        }
        i++;
    }
    return flag;
}
void turnover(char s[],int n)
{
    char temp[25];
    int j;
    strcpy(temp, s);
    for (j = 0; j < n;j++)
    {
        *(s+n-j-1) = temp[j];
    }
} 
lizhiqi-creator commented 4 years ago

这道题其他地方都很完美,你的错误主要是小数以及分数的情况下,如果小数点或者分数线前数字是0,那么前面的数字按你的程序不会输出,比如0.1,只会输出.1,这是因为程序中你的i是控制开始输出的位置,你的判断方式是如果前面为0,那就往后移动,所以如果0.1这样的情况,i移动的位置将会移动到小数点的位置上,那么输出的时候for (j = i; j < k;j++)就会从'.'开始输出,如果想要输出前面的零,需要在小数,分数,百分数的情况前加上一句特例的输出if(i==a) printf("0");加在对应情况输出的前面,这样在这种情况下就不会漏掉前面的零。相应的如果1.0这样的数,题目中要求的是要保留那个0,所以在小数模式中应当加上 if(k==a+1&&s[a]=='.') printf("0");(因为你的程序小数和百分号是同一个模式,所以需要&&s[a]=='.'作出区分),具体代码如下(注意修改过的地方)

//数字反转,包括分数,小数,百分数;
#include<stdio.h>
#include<string.h>
int k = 0;
int judge(char s[]);
void turnover(char s[], int n);
int main()
{
    char s[25],t[25]="0";
    int a,i=0,j=0,b;
    scanf("%s", s);
    while(s[k]!='\0')
        k++;
    a=judge(s);
    turnover(s, a);
    turnover(s + a + 1, k-a-1);
    while (s[i] == '0' )
        i++;

    if(s[a]=='.'||s[a]=='%')
    {
        while(s[k-1]=='0')
            k--;
         if(i==a) printf("0");
        for (j = i; j < k;j++)
            t[j-i] = s[j];
        printf("%s", t);
        if(k==a+1&&s[a]=='.') printf("0");
    }
    else if(s[a]=='/')
    {
         if(i==a) printf("0");
        b = a+1;
        while( s[b]=='0')
            b++;
        for (j = i; j <= a;j++)
            t[j - i] = s[j];
        for (j = a-i+1; j < k;j++)
            t[j] = s[b + j - a +i-1];
            printf("%s", t);
    }
    else 
    {
        for (j = i; j <k;j++)
            t[j - i] = s[j];
        printf("%s", t);
    }
    return 0;
}

int judge(char s[]){
    int flag=k, i = 0;
    while(*(s+i)!='\0')
    {
        if(*(s+i)=='/'||*(s+i)=='.'||*(s+i)=='%')
        {
            flag = i;
            break;
        }
        i++;
    }
    return flag;
}
void turnover(char s[],int n)
{
    char temp[25];
    int j;
    strcpy(temp, s);
    for (j = 0; j < n;j++)
    {
        *(s+n-j-1) = temp[j];
    }
} 
Lu-fm commented 4 years ago

(一直没发现是在最开始那里出问题, 感谢><