本题要求编写程序,计算 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
第一次接触这种运算题,做得我头皮发麻。整整做了一个小时,然后后两个测试点还过不了。后面查了一下午都没找出来。分母为0 还有负负得正的情况 以及我改了long long 也是过不了。
代码也写得很屎。。先挂出来吧。。
#include<stdio.h>
#include<math.h>
struct num{
long long fenzi;
long long fenmu;
long long zhengshu;
};
void printff(struct num x,int ret) //输出题意想要的答案
{
if(x.fenmu==0)
{
printf("Inf");return;
}
if(x.zhengshu==0)
{
if(x.fenzi==0)
{
printf("0");return;
}
if(x.fenzi<0&&ret==0)
printf("(%lld/%lld)",x.fenzi,x.fenmu);
else
printf("%lld/%lld",x.fenzi,x.fenmu);
return;
}
if(x.zhengshu>0)
{
printf("%lld",x.zhengshu);
if(x.fenzi!=0)
printf(" %lld/%lld",x.fenzi,x.fenmu);
return;
}
if(x.zhengshu<0)
{
if(ret==0)
{
printf("(%lld)",x.zhengshu);
}
if(ret==1)
printf("%lld",x.zhengshu);
if(x.fenzi!=0)
{
if(x.fenzi<0)
{
printf(" %lld/%lld",x.fenzi*-1,x.fenmu);
}
else
printf(" %lld/%lld",x.fenzi,x.fenmu);
}
return;
}
}
void tongfen(struct num *x,struct num *y) //将两个分数通分
{
if(x->fenmu!=y->fenmu)
{
int f=x->fenmu*y->fenmu;
x->fenzi=x->fenzi*y->fenmu;
y->fenzi=y->fenzi*x->fenmu;
x->fenmu=y->fenmu=f;
return;
}
else
return;
}
void change(struct num *a) //化简
{
while(a->fenzi%2==0&&a->fenmu%2==0)
{
a->fenzi/=2;a->fenmu/=2;
}
while(a->fenzi%3==0&&a->fenmu%3==0)
{
a->fenzi/=3;a->fenmu/=3;
}
while(a->fenzi%5==0&&a->fenmu%5==0)
{
a->fenzi/=5;a->fenmu/=5;
}while(a->fenzi%7==0&&a->fenmu%7==0)
{
a->fenzi/=7;a->fenmu/=7;
}
a->zhengshu=0;
if(labs(a->fenzi)>a->fenmu)
{
a->zhengshu=a->fenzi/a->fenmu;
if(labs(a->fenzi)%a->fenmu==0)
a->fenzi=0;
else
a->fenzi=a->fenzi%a->fenmu;
}
}
void add(struct num x,struct num y) //加法运算
{
struct num ans,numx,numy;
numx=x;numy=y;
tongfen(&x,&y); //先通分
ans.fenzi=x.fenzi+y.fenzi;
ans.fenmu=x.fenmu;
change(&ans);change(&numx);change(&numy);
printff(numx,0); printf(" + ");
printff(numy,0);
if(ans.zhengshu<0||ans.fenzi<0)
{
printf(" = (");
printff(ans,1);printf(")\n");
}
else
{
printf(" = ");
printff(ans,1);printf("\n");
}
return;
}
void ajj(struct num x,struct num y) //减法运算
{
struct num ans,numx,numy;
numx=x;numy=y;
tongfen(&x,&y); //先通分
ans.fenzi=x.fenzi-y.fenzi;
ans.fenmu=x.fenmu;
change(&ans);change(&numx);change(&numy);
printff(numx,0); printf(" - ");
printff(numy,0);
if(ans.zhengshu<0||ans.fenzi<0)
{
printf(" = (");
printff(ans,1);printf(")\n");
}
else
{
printf(" = ");
printff(ans,1);printf("\n");
}
return;
}
void CF(struct num x,struct num y) //乘法
{
struct num numx,numy,ans;
numx=x;numy=y;
ans.fenzi=numx.fenzi*numy.fenzi;
ans.fenmu=numx.fenmu*numy.fenmu;
change(&ans);change(&numx);change(&numy);
printff(numx,0); printf(" * ");
printff(numy,0);
if(ans.zhengshu<0||ans.fenzi<0)
{
printf(" = (");
printff(ans,1);printf(")\n");
}
else
{
printf(" = ");
printff(ans,1);printf("\n");
}
return;
}
void chufa(struct num x,struct num y) //除法
{
struct num numx,numy,ans;
numx=x;numy=y;
if(numy.fenzi==0)
{
change(&numx);change(&numy);
printff(numx,0); printf(" / ");
printff(numy,0);printf(" = ");printf("Inf");
return;
}
ans.fenzi=numx.fenzi*numy.fenmu;
ans.fenmu=numx.fenmu*numy.fenzi;
if(ans.fenmu<0)
{
ans.fenmu*=-1;ans.fenzi*=-1;
}
change(&ans);change(&numx);change(&numy);
printff(numx,0); printf(" / ");
printff(numy,0);
if(ans.zhengshu<0||ans.fenzi<0)
{
printf(" = (");
printff(ans,1);printf(")\n");
}
else
{
printf(" = ");
printff(ans,1);
}
return;
}
int main()
{
struct num x,y,numx,numy;
scanf("%lld/%lld",&x.fenzi,&x.fenmu);
scanf("%lld/%lld",&y.fenzi,&y.fenmu);
numx=x;numy=y;
//加法运算
add(x,y);
ajj(x,y);
CF(x,y);
chufa(x,y);
return 0;
}
测试点 | 结果 | 分数 | 耗时 | 内存 |
---|---|---|---|---|
0 |
答案正确 | 9 | 7 ms | 328 KB |
1 |
答案正确 | 5 | 4 ms | 196 KB |
2 |
答案错误
| 0 | 4 ms | 324 KB |
3 |
答案错误
| 0 | 4 ms | 196 KB |