| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 805 人关注过本帖
标题:编译错误 求指教 分数加减 可能是越界了
只看楼主 加入收藏
凉粉呵呵
Rank: 1
等 级:新手上路
帖 子:73
专家分:0
注 册:2013-2-10
结帖率:81.82%
收藏
已结贴  问题点数:20 回复次数:18 
编译错误 求指教 分数加减 可能是越界了
分数加减法

编写一个C程序,实现两个分数的加减法
输入
输入包含多行数据
每行数据是一个字符串,格式是"a/boc/d"。
其中a, b, c, d是一个0-9的整数。o是运算符"+"或者"-"。

数据以EOF结束
输入数据保证合法
输出
对于输入数据的每一行输出两个分数的运算结果。
注意结果应符合书写习惯,没有多余的符号、分子、分母,并且化简至最简分数
样例输入
1/8+3/8
1/4-1/2
1/3-1/3




源代码:

#include<stdio.h>
int p,q;
int main()
{
    char a[1000],ch;
    int i,min,son,mon;
    void fact(int mon,int son);
    while((gets(a))!=NULL)
{    a[0]=a[0]-48;
    a[2]=a[2]-48;
    a[4]=a[4]-48;
    a[6]=a[6]-48;   
    min=(a[2]<a[6]?a[2]:a[6]);
    for(i=1;;i++)
    {
        if((min*i%a[6]==0)&&(min*i%a[2]==0))
            break;
    }
    mon=min*i;
    a[0]=mon/a[2]*a[0];
    a[4]=mon/a[6]*a[4];
    if((a[3]=='-')&&(a[0]<=a[4]))
    {   
        if(a[0]==a[4])
            printf("0\n");   
        
        else
        {
            ch='-';
            son=a[4]-a[0];
        fact(mon,son);
        printf("%c%d/%d\n",ch,q,p);
        }

    }
   
    else
    {
        son=a[0]+a[4];
        fact(mon,son);
        printf("%d/%d\n",q,p);
    }   
}
    return 0;
   
}

void fact(int mon,int son)

{   int r,m,n;
    m=mon;
    n=son;
    r=1;
    while(r!=0)
    {
        r=m%n;
        m=n;
        if(r!=0)
        n=r;
    }
    p=mon/n;
    q=son/n;
}
搜索更多相关主题的帖子: include 加减法 字符串 
2013-02-27 12:20
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
收藏
得分:0 
。。。

仰望星空...........不忘初心!
2013-02-27 12:23
小xiong
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:388
专家分:1722
注 册:2013-2-8
收藏
得分:0 
我滴个神啊,
2013-02-27 12:59
℃Buffer
Rank: 2
等 级:论坛游民
帖 子:25
专家分:48
注 册:2013-2-26
收藏
得分:0 
程序太烦了,没有模板分块啊!注释也没有啊!
2013-02-27 13:05
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
复制过来试了试,结果正确,啧啧


[fly]存在即是合理[/fly]
2013-02-27 13:15
未微电子
Rank: 2
来 自:丹霞地貌
等 级:论坛游民
帖 子:47
专家分:57
注 册:2013-2-24
收藏
得分:0 
void fact(int mon,int son);没有在main函数前声明啊

失信于一人,才跌入凄凉的境界。
2013-02-27 13:50
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:20 
没考虑整除的情况,比如1/2+1/2、4/3-1/3这类。

学习建议:要锻炼问题的分析能力,化繁为简是这种能力的体现。

下面是该题的AC代码,谁能给每句都加上注释,有奖!

程序代码:
#include<stdio.h>
int main()
{
    int a, b, c, d, e, f;
    while(scanf("%d/%d%d/%d", &a, &b, &c, &d) != EOF)
    {
        e = a * d + b * c;
        f = b * d;
        for(b = e, c = f; d = b % c; b = c, c = d);
        e /= c;
        f /= c;
        if(f < 0) f = -f, e = -e;
        if(f == 1) printf("%d\n", e);
        else printf("%d/%d\n", e, f);
    }
    return 0;
}


[ 本帖最后由 beyondyf 于 2013-2-27 14:10 编辑 ]

重剑无锋,大巧不工
2013-02-27 13:59
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
程序代码:
#include <stdio.h>
#include <math.h>
int main()
{
    int a, b, c, d, e, f;
    while(scanf("%d/%d%d/%d", &a, &b, &c, &d) != EOF)
    {
        e = a * d + b * c;    //分子
        f = b * d;            //分母     e / f 就是 a / b + c / d 的结果
        
        a = e * f < 0 ? -1 : 1;        //a是正负判断,同号为正,异号为负
        e = abs(e);    f = abs(f);        //求绝对值
        
        //化简过程
        for(b = e, c = f; d = b % c; b = c, c = d);    //辗转相除法求 e、f最大公约数 c
        e /= c;    f /= c;
        
        if(f == 1) printf("%d\n", a * e);
        else printf("%d/%d\n", a * e, f);
    }
    return 0;
}
收到的鲜花
  • beyondyf2013-02-27 14:30 送鲜花  50朵   附言:我很赞同


[fly]存在即是合理[/fly]
2013-02-27 14:20
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
for(b = e, c = f; d = b % c; b = c, c = d);
大概是最简单的辗转相除求最大公约数了吧
c

神啊  循环还能这样用

DO IT YOURSELF !
2013-02-27 14:21
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
很久不见小黑了,就奖励50积分吧。

代码是随手写的,写完了提交看了看结果就发上来了。

重新审视自己的代码发现符号的剥离完全没有意义,于是修改了代码,删掉了符号剥离部分。我不喜欢多余的东西,呵呵。

重剑无锋,大巧不工
2013-02-27 14:36
快速回复:编译错误 求指教 分数加减 可能是越界了
数据加载中...
 
   



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

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