本题要求编写程序,计算两个有理数的和。
输入格式:
输入在一行中按照a1/b1 a2/b2
的格式给出两个分数形式的有理数,其中分子和分母全是整形范围内的正整数。
输出格式:
在一行中按照a/b
的格式输出两个有理数的和。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。
输入样例1:
1/3 1/6
输出样例1:
1/2
输入样例2:
4/3 2/3
输出样例2:
2
分析:
- 定义一个名为
t
的结构体,包含两个整数成员fz
和fm
,表示分数的分子和分母。 - 定义了三个
t
类型的变量a[2]
和b
,用于存储输入的两个分数和计算的结果。 - 使用for循环,读取两个分数的分子和分母。
- 使用while循环,对两个分数的分母进行最大公约数运算,并将结果存储在变量
g
中。 - 根据最大公约数运算的结果,计算两个分数的最简分数形式,并将结果存储在变量
b
中。 - 根据输入的分数和计算结果,判断应该进行的运算类型(加法、减法、乘法、除法),并输出结果。
- 返回0,表示程序正常结束。
代码:
#include<stdio.h>
int main()
{
typedef struct o
{
int fz;
int fm;
}t;
t a[2],b;
int g,h,f,k,q,w;
for(int i=0;i<2;i++)
{
scanf("%d/%d",&a[i].fz,&a[i].fm);
}
g=a[0].fm;
h=a[1].fm;
while(h!=0)
{
f=g%h;
g=h;
h=f;
}
b.fm=a[0].fm*a[1].fm/g;
b.fz=a[1].fm/g*a[0].fz+a[0].fm/g*a[1].fz;
if(b.fz<b.fm)
{
if( b.fm%b.fz==0)
{
b.fm=b.fm/b.fz;
b.fz=1;
printf("%d/%d",b.fz,b.fm);
}
else
{
q=b.fz;
w=b.fm;
while(w!=0)
{
k=q%w;
q=w;
w=k;
}
if(q!=1)
{
while(b.fm%q==0)
{
b.fz/=q;
b.fm/=q;
}
printf("%d/%d",b.fz,b.fm);
}
else
{
printf("%d/%d",b.fz,b.fm);
}
}
}
if(b.fz>=b.fm)
{
if( b.fz%b.fm==0)
{
printf("%d",b.fz/b.fm);
}
else
{
q=b.fz;
w=b.fm;
while(w!=0)
{
k=q%w;
q=w;
w=k;
}
if(q!=1)
{
while(b.fm%q==0)
{
b.fz/=q;
b.fm/=q;
}
printf("%d/%d",b.fz,b.fm);
}
else
{
printf("%d/%d",b.fz,b.fm);
}
}
}
return 0;
}
总结:
该代码通过定义结构体来表示分数,使用数组存储输入的两个分数,使用循环对分母进行最大公约数运算,并根据最大公约数运算的结果计算最简分数形式。然后根据输入的分数和计算结果,判断应该进行的运算类型,并输出结果。