一直Runtime error,给跪了。。。求解救!

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <math.h>
#define maxn 200
char ch;
long a[maxn],a_n,digit,sign;
long fenzi,fenmu;


long gcd(long a ,long b)
{
    if (b==0)
       return a;
    else
       return gcd(b,a%b);
}
void gcd_process(long x, long y)
{
    if(y==0)
    {
        return;
    }
    else
    {
        a[a_n]=x/y;
        a_n++;
        gcd_process(y,x%y);
        return;
    }
}
void ToFen() // 转换为分数
{
    long i;
    long t;
    digit=0;
    ch=getchar();
    a_n=0; // 连分数的项数个数

    if (ch=='-')
    {
        sign=-1; //标记负数
        ch=getchar();
    }

    while (ch!='\n')  //提取连分数的各个项存储在 a[i]中
    {
        if (ch>='0' && ch<='9')
        {
            digit = digit*10 + ch-'0';
        }
        else
        {
            a[a_n]=digit;
            a_n++;
            digit = 0;
        }
        ch=getchar();
    }
    fenzi=a[a_n-1];
    fenmu=1;
    long yueshu;
    for (i=a_n-1 -1; i>=0; i--) //进行转换
    {
        if (i==0)
        {
            if (sign==1)
            {
                t=fenmu;
                fenmu = fenzi;
                fenzi = t + fenzi *a[i];
            }
            else
            {
                t=fenmu;
                fenmu = fenzi;
                fenzi = fenzi *a[i]- t;
            }
        }
        else
        {
            t=fenmu;
            fenmu = fenzi;
            fenzi = t + fenzi * a[i];
        }
    }

    yueshu = gcd(fenzi,fenmu);
    //化简分数
    fenzi /= yueshu;
    fenmu /= yueshu;

    // output
    if (sign==-1) printf("-");
    if (fenmu==1)
    {
        printf("%ld\n",fenzi);
    }
    else
    {
        printf("%ld/%ld\n",fenzi,fenmu);
    }
}
void ToLian() //转换为连分数
{
    long i;
    digit=0;
    a_n=0;
    if (ch=='-')
    {
        sign=-1; //负号标示
        ch=getchar();
    }
    while (1) //提取分子fenzi 和分母fenmu
    {
        if (ch>='0' && ch<='9')
        {
            digit = digit*10 + ch-'0';
        }
        else
        {
            a[a_n]=digit;
            a_n++;
            digit = 0;
        }
        if (ch=='\n') break;
        ch=getchar();
    }
    if (a_n==1)
    {
        printf("[");
        if(sign==-1) printf("-");
        printf("%ld]\n",a[0]);
        return;
    }
    fenzi=a[0];
    fenmu=a[1];
    a_n=0;
    // 将得到的 连分数的项 存储在a[i]中
    if (sign==1)
    {
        gcd_process(fenzi,fenmu);//依次存储
    }
    else if (sign==-1)
    {
        if (fenzi%fenmu==0)
        {
            gcd_process(fenzi,fenmu);
        }
        else
        {
            a[0]=fenzi/fenmu+1;
            a_n++;
            gcd_process(fenmu,a[0]*fenmu-fenzi);

        }
    }

    //output
    if (a_n>1)
    {
        printf("[");
        if(sign==-1) printf("-");
        printf("%ld;",a[0]);
        for (i=1;i< a_n-1; i++)
        {
            printf("%ld,",a[i]);
        }
        printf("%ld]\n",a[a_n-1]);
    }
    else
    {
        printf("[");
        if(sign==-1) printf("-");
        printf("%ld]\n",a[0]);
        return;

    }
}
int main()
{
    while(~(ch=getchar()))
    {
        sign=1; // 1 positive -1 negative
        if (ch=='[')
            ToFen();  // 转换为分数
        else
            ToLian(); //转换为连分数
    }

    return 0;
}

1 条评论

  • @ 2016-08-05 14:50:08

    一个一个读取字符怎么就不行呢? 最后一行的末尾没有\n,使得我的程序runtime error 或者 TLE ?
    whatever, 读取字符串后就AC 啦~~~

  • 1

信息

ID
1696
难度
7
分类
其他 | 数学模拟 点击显示
标签
递交数
5158
已通过
1140
通过率
22%
被复制
3
上传者