您的位置:首页 > 其它

1034. 有理数四则运算(20)

2016-04-30 17:23 507 查看
本题要求编写程序,计算2个有理数的和、差、积、商。输入格式:输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为0。输出格式:分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分;若为负数,则须加括号;若除法分母为0,则输出“Inf”。题目保证正确的输出中没有超过整型范围的整数。输入样例1:
2/3 -4/2
输出样例1:
2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)
输入样例2:
5/3 0/6
输出样例2:
1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf思路分析:这道题逻辑上挺简单的,但是输入输出较为复杂,实在调试不出来重写一遍吧。代码如下:
// 1034.有理数四则运算(20)sec.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<stdio.h>
typedef struct{
long a1;
long a2;
long integer=0;
long flags=2;
long flagmin=1;
}Num;
Num disposal(Num num) {
long long aa1, aa2,temp;
if (num.a2 == 0) {
num.flags = 3;
return num;

}
if (num.a1 < 0) {
aa1 = -num.a1;
num.flagmin = -1;
aa2 = num.a2;
}
else if (num.a1 == 0) {
num.flags = 0;
num.integer = 0;
return num;
}
else if (num.a1>0) {
aa1 = num.a1;
aa2 = num.a2;
}
if (aa1 < aa2) {
temp = aa1;
aa1 = aa2;
aa2 = temp;
}
while (aa1%aa2 != 0) {
temp = aa1%aa2;
aa1 = aa2;
aa2 = temp;
}
num.a1 = num.a1/ aa2;
num.a2 = num.a2 / aa2;
if (num.a1>0) {
aa1 = num.a1;
aa2 = num.a2;
}
else {
aa1 = -num.a1;
aa2 = num.a2;
}
if (aa1 >= aa2) {
if (aa1%aa2 == 0) {
num.integer = num.flagmin*aa1 / aa2;
num.flags = 0;
}
else {
num.integer = num.flagmin*aa1 / aa2;
num.a1 = aa1%aa2;
num.flags = 1;
}
}
else {
num.flags = 2;

}
return num;

}
void display(Num num) {
if (num.flags == 0) {
if(num.flagmin==1)
printf("%ld", num.integer);
else {
printf("(%ld)", num.integer);
}
}
else if (num.flags == 1) {
if (num.flagmin == 1){
printf("%ld", num.integer);
printf(" %ld/%ld", num.a1, num.a2);
}

else {
printf("(%ld", num.integer);
printf(" %ld/%ld)", num.a1, num.a2);
}
}
else if (num.flags == 2) {
if (num.flagmin == 1)
printf("%ld/%ld", num.a1,num.a2);
else {
printf("(%ld/%ld)", num.a1,num.a2);
}
}
else if (num.flags == 3) {
printf("Inf");
}
}
int main()
{
Num numa, numb,nums,numc,nump,numd;
scanf("%ld/%ld %ld/%ld", &numa.a1,&numa.a2,&numb.a1,&numb.a2);
//printf("%ld %ld %ld %ld", numa.a1, numa.a2, numb.a1, numb.a2);

nums.a2 = numa.a2*numb.a2;
nums.a1 = numa.a1*numb.a2 + numb.a1*numa.a2;
numc.a2 = nums.a2;
numc.a1 = numa.a1*numb.a2 - numb.a1*numa.a2;
nump.a2 = nums.a2;
nump.a1 = numa.a1*numb.a1;
if (numa.a1< 0) {
if (numb.a1 >=0) {
numd.a1 = numa.a1*numb.a2;
numd.a2 = numa.a2*numb.a1;
}
else {
numd.a1 = (-numa.a1)*numb.a2;
numd.a2 = (-numb.a1)*numa.a2;

}
}
else {
if (numb.a1 >= 0) {
numd.a1 = numa.a1*numb.a2;
numd.a2 = numa.a2*numb.a1;
}
else {
numd.a1 =- (numa.a1)*numb.a2;
numd.a2 = (-numb.a1)*numa.a2;

}
}

display(disposal(numa));
printf(" + ");
display(disposal(numb));
printf(" = ");
display(disposal(nums));
printf("\n");

display(disposal(numa));
printf(" - ");
display(disposal(numb));
printf(" = ");
display(disposal(numc));
printf("\n");

display(disposal(numa));
printf(" * ");
display(disposal(numb));
printf(" = ");
display(disposal(nump));
printf("\n");

display(disposal(numa));
printf(" / ");
display(disposal(numb));
printf(" = ");
display(disposal(numd));
printf("\n");

return 0;
}

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: