| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 749 人关注过本帖
标题:又是一道错误的答案题,明明测试数据都过了。。。。。。。。。
取消只看楼主 加入收藏
b465513006
Rank: 2
等 级:论坛游民
威 望:1
帖 子:70
专家分:48
注 册:2011-3-18
结帖率:73.33%
收藏
已结贴  问题点数:30 回复次数:4 
又是一道错误的答案题,明明测试数据都过了。。。。。。。。。
这是农大oj上的题目,目的是求分式的运算,如  6/7 + 5/4 可以是加减乘除,网址是http://acm.fafu.请高手帮我看看我这程序哪里有错误,测试数据有点大,所以我定义的类型都是__int64的
#include<stdio.h>
#include<string.h>


struct p//这是定义数的结构体
{
    __int64 fm , fz ;//fm是分母,fz是分子
}number[2],end ;


int gcd(__int64 a , __int64 b)//求最大公约数
{
    __int64 r,t;
    if(a<b)
    {
      t=a;
      a=b;
      b=t;
    }
    do
    {
      r=a%b;
      a=b;
      b=r;
    }while(r!=0);
    return a ;
}


int main()
{
    __int64 n ,t,t1 , t2 ,gcr;
    scanf("%I64d",&n) ;
    char a[4] ;
    while(n--)
    {
        scanf("%I64d/%I64d %c %I64d/%I64d",&number[1].fz,&number[1].fm,&a[2],&number[2].fz,&number[2].fm) ;//输入表达式
        if(a[2]=='*')//两个数是乘的情况
        {
            end.fm=number[1].fm*number[2].fm ;
            end.fz=number[1].fz*number[2].fz ;
            if(end.fm!=0 && end.fz!=0)//讨论不为0的情况,为0的另外讨论
            {
                t=gcd(end.fm,end.fz) ;
                end.fm/=t ;
                end.fz/=t ;
            }
        }
        else if(a[2]=='/')//除的情况
        {
            end.fm=number[1].fm*number[2].fz ;
            end.fz=number[1].fz*number[2].fm ;
            if(end.fm!=0 && end.fz!=0)
            {
                t=gcd(end.fm,end.fz) ;
                end.fm/=t ;
                end.fz/=t ;
            }
        }
        else //加和减的一起讨论
        {
            if(number[1].fm!=0 && number[2].fm!=0)
            {
                t=gcd(number[1].fm,number[2].fm) ;
                gcr = number[1].fm * number[2].fm / t ;//求最大公倍数
                t1 = gcr / number[1].fm ;
                t2 = gcr / number[2].fm ;//通分
                number[1].fz *= t1 ;
                number[2].fz *= t2 ;
                if(a[2]=='+')
                    end.fz=number[1].fz+number[2].fz ;
                else if(a[2]=='-')
                    end.fz=number[1].fz-number[2].fz ;   
                end.fm=number[1].fm*t1 ;
                if(end.fz!=0)
                {
                    t=gcd(end.fm,end.fz) ;
                    end.fm/=t ;
                    end.fz/=t ;
                }
            }

        }
        if(end.fm==0)//这里开始是输出,分别讨论分子分母各为0的情况
            printf("INF\n") ;
        else if(end.fz==0)
        {
            end.fm=1 ;
            printf("%I64d/%I64d\n",end.fz,end.fm) ;

        }
        else if(end.fm<0)//把负号提前,题目的要求是这样
        {
            end.fm*=-1 ;
            end.fz*=-1 ;
            printf("%I64d/%I64d\n",end.fz,end.fm) ;
        }
        else
            printf("%I64d/%I64d\n",end.fz,end.fm) ;
    }   
    return 0 ;
}

[ 本帖最后由 b465513006 于 2011-8-8 19:03 编辑 ]
搜索更多相关主题的帖子: 测试 include number 公约数 结构体 
2011-08-08 16:44
b465513006
Rank: 2
等 级:论坛游民
威 望:1
帖 子:70
专家分:48
注 册:2011-3-18
收藏
得分:0 
回复 2楼 zanzan1986
我错了,平常没有加注习惯啊,我试试吧
2011-08-08 18:49
b465513006
Rank: 2
等 级:论坛游民
威 望:1
帖 子:70
专家分:48
注 册:2011-3-18
收藏
得分:0 
回复 4楼 voidx
除最大公约数应该能达到这一点吧
2011-08-08 19:02
b465513006
Rank: 2
等 级:论坛游民
威 望:1
帖 子:70
专家分:48
注 册:2011-3-18
收藏
得分:0 
回复 7楼 voidx
那个会等于INF啊,而且那个数据中间要加空格的,加了答案就是INF了,我加减等于0是有考虑的,在下面输出的时候我有讨论当答案的分子或者分母等于0的情况,那个输入不知道有没有错,但是我找管理员要测试数据自己运行答案都是对的,但是在评测系统上测试都是错的,所以我就想是不是什么细节错了,但是自己检查不出来
2011-08-09 08:49
b465513006
Rank: 2
等 级:论坛游民
威 望:1
帖 子:70
专家分:48
注 册:2011-3-18
收藏
得分:0 
过了,呵呵。。。。。是number那个数组定义太小了,我改大一点就过了。。。。。。。。。。。。。
2011-08-09 08:55
快速回复:又是一道错误的答案题,明明测试数据都过了。。。。。。。。。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.038350 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved