1 题目要求
本题要求编写程序,计算N个有理数的平均值。
输入格式:
输入第一行给出正整数N(≤100);第二行中按照a1/b1 a2/b2 …的格式给出N个分数形式的有理数,其中分子和分母全是整形范围内的整数;如果是负数,则负号一定出现在最前面。
输出格式:
在一行中按照a/b的格式输出N个有理数的平均值。注意必须是该有理数的最简分数形式,若分母为1,则只输出分子。
2 样例
输入样例1:
4
1/2 1/6 3/6 -5/10
输出样例1:
1/6
输入样例2:
2
4/3 2/3
输出样例2:
1
3 分析
(1)是对一个序列分式的加法,再做乘法。
(2)分别用a[],b[],两个数组保存序列的分子和分母
(3)在有理数加法的基础上,加数是上一次计算的两数之和(结果用result[] 保存,初始为{0,0})
(4)在所有加法都算完之后再约分
4 代码
#include <stdio.h>
int result[2]={0,0};
int gcd2(int a,int b)
{
if(a%b==0)
return b;
else
return gcd2(b,a%b);
}
int change(int *a,int *b)
{
int tmp=*a;
*a=*b;
*b=tmp;
return 0;
}
int* rationalAdd2(int a1,int b1,int a2,int b2)
{
// int c,d;
if(a2==0&&b2==0)
{
result[0]=a1;
result[1]=b1;
return result;
}
if(b1!=b2)
{
//小 + 大
if(b1>b2)
{
change(&b1,&b2);
change(&a1,&a2);
}
//通分
if(b2%b1==0)
{//两个分母可约分
//!!!
a1=a1*(b2/b1);
b1=b2;
//printf("%d %d\n",a1,b2);
}
else{//两个分母不互质
int orig_b1=b1;
b1=b1*b2;
a1=a1*b2;
// b2=b2*b1;
a2=a2*orig_b1;
// printf("%d %d\n",a1+a2,b1);
}
}
//分子
result[0]=a1+a2;
//分母
result[1]=b1;
// printf("%d/%d\n",result[0],result[1]);
return result;
}
int average(int result[],int length)
{
//分母* n
result[1]=result[1]*length;
//分母=1时,只输出分子
if(result[1]/gcd2(result[0],result[1])==1)
printf("%d",result[0]/gcd2(result[0],result[1]));
else
printf("%d/%d",result[0]/gcd2(result[0],result[1]),result[1]/gcd2(result[0],result[1]));
}
int inputModule(int a[],int b[],int n)
{
for(int i=0;i<n;i++)
{
scanf("%d/%d",&a[i],&b[i]);
// printf("%d/%d",a[i],b[i]);
}
int *p=NULL;
for(int i=0;i<n;i++)
{
p=rationalAdd2(a[i],b[i],result[0],result[1]);
// printf("%d",*p,*p++);
result[0]=*p;
result[1]=*(p+1);
}
average(result,n);
}
int main()
{
int n;
scanf("%d",&n);
//a 保存分子,b保存分母
int a[n],b[n];
inputModule(a,b,n);
return 0;
}
5 总结
(1)数组作为返回值 ——使用指针
(2)交换变量的值——函数参数传递 change()函数
改变指针变量的值
改变指针所指的变量的值
(3)全局变量与局部变量——二者重名时,在局部的时候局部变量起作用。
extern 外部全局变量,该全局变量在另一文件中被引用时,加此关键字可以跨文件使用变量。
static 限定变量只在当前文件中使用。但在整个程序的其他文件运行时,静态变量仍然占据内存单元
: C++入门经典-例4.10-使用static变量实现累加.。