1. 有理数加法 (15分
)
本题要求编写程序,计算两个有理数的和。
输入格式:
输入在一行中按照a1/b1 a2/b2的格式给出两个分数形式的有理数,其中分子和分母全是整形范围内的正整数。
输出格式:
在一行中按照a/b的格式输出两个有理数的和。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。
输入样例1:
1/3 1/6
输出样例1:
1/2
输入样例2:
4/3 2/3
输出样例2:
2
参考代码:
#include<iostream>
#include<iomanip>
#include<cstdio>
using namespace std;#
int gongyue(int a,int b)
{
while(a!=b)
{
if(a>b)
{
a=a-b;
}
else
{
b=b-a;
}
}
return a;
}
int main(void)
{
int a1,b1,a2,b2;
scanf("%d/%d",&a1,&b1);
scanf("%d/%d",&a2,&b2);
int c1=gongyue(b1,b2);
int c2=(b1*b2)/c1;
int c3=(a1)*(c2/b1)+(a2)*(c2/b2);
int c4=gongyue(c3,c2);
if(c2==c4)
{
printf("%d\n",c3/c4);
}
else
{
printf("%d/%d\n",c3/c4,c2/c4);
}
return 0;
}
2.有理数均值 (20分)
本题要求编写程序,计算N个有理数的平均值。
输入格式:
输入第一行给出正整数N(\le≤100);第二行中按照a1/b1 a2/b2 …的格式给出N个分数形式的有理数,其中分子和分母全是整形范围内的整数;如果是负数,则负号一定出现在最前面。
输出格式:
在一行中按照a/b的格式输出N个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。
输入样例1:
4
1/2 1/6 3/6 -5/10
输出样例1:
1/6
输入样例2:
2
4/3 2/3
输出样例2:
1
参考代码:
#include<iostream>
#include<iomanip>
#include<cstdio>
using namespace std;
struct fenshu
{
int fenzi;
int fenmu;
};
int gongyue(int m, int n) { /* 求最大公约数 */
int r;
if(m == 0 && n == 0)
return 0;
if(m == 0)
return n;
if(n == 0)
return m;
while(1) {
r = m % n;
if(r == 0)
break;
m = n;
n = r;
}
return n;
}
int gongbei(struct fenshu *array,int n)
{
int x,y,num=array[0].fenmu,i,gcd; //去数组的第一和第二个数,计算它们的公倍数,然后再取第三个数,
//和之前的公倍数计算它们的公倍数,直到只有一个数。
for(i=0; (i+1)<n; i++)
{
x=num;
y=array[i+1].fenmu;
//计算公约数
gcd = gongyue(x,y);
//计算公倍数
num = x/gcd * y/gcd * gcd;
}
return num;
}
int main(void)
{
int n,sum=0,flag=0;
struct fenshu array[101];
cin>>n;
for(int i=0; i<n; i++)
{
scanf("%d/%d",&array[i].fenzi,&array[i].fenmu);
}
int c=gongbei(array,n);
for(int i=0; i<n; i++)
{
sum=sum+(c/array[i].fenmu)*array[i].fenzi;
}
c*=n;
if(sum<0)
{
sum*=-1;
flag=1;
}
int c1=gongyue(sum,c);
if(flag==1)
{
sum*=-1;
}
if(c1==c)
{
printf("%d\n",sum/c1);
}
else
{
printf("%d/%d\n",sum/c1,c/c1);
}
return 0;
}
总结
最大公约数的求法
1. 相减法
2. 辗转相除法
3. 穷举法
最小公倍数等于两数之积除以最大公约数
代码举例:
1. 相减法
int zuidagongyueshu(int a,int b)
{
while(a!=b)
{
if(a>b)
{
a=a-b;
}
else
{
b=b-a;
}
}
return a;
}
2. 辗转相除法
int zuidagongyueshu(int m,int n)
{
int r;
if(m == 0 && n == 0)
return 0;
if(m == 0)
return n;
if(n == 0)
return m;
while(1) {
r = m % n;
if(r == 0)
break;
m = n;
n = r;
}
return n;
}
3. 穷举法
思路:
有两整数a和b:
① i=1
② 若a,b能同时被i整除,则t=i
③ i++
④ 若 i <= a(或b),则再回去执行②
⑤ 若 i > a(或b),则t即为最大公约数,结束
#include<stdio.h>
void main () /* 穷举法求最大公约数 */
{
int m, n, a, b, i, t;
scanf ("%d,%d", &a, &b);
m=a; n=b; //记录a,b 的初值
for (i=1; i<= a; i++)
if ( a%i ==0 && b%i ==0 )
t=i;
printf("The largest common divisor:%d\n", t);
printf("The least common multiple:%d\n", m*n/t);
}