OpenJudge计算概论-分数求和
2013-11-28 23:23
211 查看
/*====================================================== 1006:分数求和 总时间限制: 1000ms 内存限制: 65536kB 描述 输入n个分数并对他们求和,用约分之后的最简形式表示。 比如: q/p = x1/y1 + x2/y2 +....+ xn/yn, q/p要求是归约之后的形式。 如:5/6已经是最简形式,3/6需要规约为1/2, 3/1需要规约成3,10/3就是最简形式。 PS:分子和分母都没有为0的情况,也没有出现负数的情况 输入 第一行的输入n,代表一共有几个分数需要求和 接下来的n行是分数 输出 输出只有一行,即归约后的结果 样例输入 2 1/2 1/3 样例输出 5/6 解析:这个题呢,主要是要注意最后输出时分母可能是1. 另外,这里保证了输入的分子和分母都没有0和负数,所以处理简单化了。 ========================================================*/ #include<stdio.h> struct fraction { int a,b;//分数a/b的分子和分母 }; int Gcd(int a,int b);//返回a和b的最大公约数 int Lcm(int a,int b);//返回a和b的最小公倍数 int main() { int n,i,d; struct fraction f1,f2; char c; //freopen("3.in","r",stdin); scanf("%d",&n); scanf("%d%c%d",&f2.a,&c,&f2.b); d=Gcd(f2.a,f2.b); if(d>1) { f2.a=f2.a/d; f2.b=f2.b/d; } for(i=2;i<=n;i++) { scanf("%d%c%d",&f1.a,&c,&f1.b); d=Lcm(f2.b,f1.b); f2.a=f2.a*d/f2.b+f1.a*d/f1.b; f2.b=d; d=Gcd(f2.a,f2.b); if(d>1) { f2.a=f2.a/d; f2.b=f2.b/d; } } if(f2.b>1) printf("%d/%d\n",f2.a,f2.b); else printf("%d\n",f2.a); return 0; } int Gcd(int a,int b) { int c; if(a<=0||b<=0) return -1; if(a<b) { c=a; a=b; b=c; } c=a%b; while(c!=0) { a=b; b=c; c=a%b; } return b; } int Lcm(int a,int b) { int c; if(a<=0||b<=0) return -1; c=Gcd(a,b); return a*b/c; }
相关文章推荐
- C++ 第十周上机任务-分数求和2
- 分数序列求和
- 天梯赛模拟题_(N个分数的求和)
- 平日小问题(3):分数的求和问题
- 分数数列求和
- 求分数序列和:int求和,小心溢出
- 12:分数求和
- c++第十周上机任务-分数求和1
- 分子为一的分数求和
- c++上机实验4-分数求和
- 第十周上机项目分数求和1
- 分数求和:一道很有意思的题,而且最后的返回值的处理问题也需要注意
- PAT L1-009. N个数求和 分数求和 struct重载
- 分数加分(迭代求和)
- 分数求和
- 再谈分数求和:求最大公约数——老吴憨算法和辗转相除法
- 分数求和问题
- C4top-N个数求和 (分数求和模拟)
- hdu--2503--分数求和
- c++第四次上级实验——分数求和