| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 749 人关注过本帖
标题:又是一道错误的答案题,明明测试数据都过了。。。。。。。。。
只看楼主 加入收藏
b465513006
Rank: 2
等 级:论坛游民
威 望:1
帖 子:70
专家分:48
注 册:2011-3-18
结帖率:73.33%
收藏
已结贴  问题点数:30 回复次数:10 
又是一道错误的答案题,明明测试数据都过了。。。。。。。。。
这是农大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
zanzan1986
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:140
注 册:2011-2-22
收藏
得分:10 
又不说是什么题目,代码又不加注。别人会有那么多了时间来摸探你这段无名代码吗??????????
你可能是个新手,大多数新手常常不加注的。
2011-08-08 18:10
b465513006
Rank: 2
等 级:论坛游民
威 望:1
帖 子:70
专家分:48
注 册:2011-3-18
收藏
得分:0 
回复 2楼 zanzan1986
我错了,平常没有加注习惯啊,我试试吧
2011-08-08 18:49
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:10 
回复 3楼 b465513006
分数化简过程不对,只上下同除了他们的最大公约数,应该是一直化简到上下互质

[ 本帖最后由 voidx 于 2011-8-8 19:00 编辑 ]
2011-08-08 18:55
b465513006
Rank: 2
等 级:论坛游民
威 望:1
帖 子:70
专家分:48
注 册:2011-3-18
收藏
得分:0 
回复 4楼 voidx
除最大公约数应该能达到这一点吧
2011-08-08 19:02
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
回复 5楼 b465513006
啊~好像是的,我又白痴了。
最近得了白痴病,唉~该去看医生了
2011-08-08 20:12
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
你试试下面的数据:

1
1/0+1/2
2011-08-08 20:34
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
scanf("%I64d/%I64d %c %I64d/%I64d",&number[1].fz,&number[1].fm,&a[2],&number[2].fz,&number[2].fm) ;

楼主你这个~ 有点说不过去了,怎么能有 number[2] 捏,直接 scanf() 到 end 里去了
然后加减的时候分母为 0 的情况也木有处理

[ 本帖最后由 voidx 于 2011-8-8 20:55 编辑 ]
2011-08-08 20:53
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.043407 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved