摘要本文是PTA编程题有理数均值的题解涵盖题目描述、输入输出格式及C语言实现展示核心算法最大公约数(GCD)约分、分数通分累加求平均。题目描述本题要求编写程序计算N个有理数的平均值。输入格式输入第一行给出正整数N≤100第二行中给出N个分数形式的有理数其中分子和分母全是整形范围内的整数正负均可没有分母为0的情况。输出格式在一行中按照a/b的格式输出N个有理数的平均值。注意必须是该有理数的最简分数形式若分母为1则只输出分子。输入样例4 1/2 1/6 3/6 -5/10输出样例-1/12解题思路核心问题分析本题需要解决的核心问题分数输入解析识别输入中的分数格式分子/分母或整数格式分数累加求和多个分数相加需要通分避免浮点数精度丢失求平均值总和除以个数N最简分数输出用最大公约数约分保证分母为正算法原理说明辗转相除法(GCD)用于求最大公约数对分数进行约分。公式gcd(a, b) gcd(b, a % b)直到b为0时a即为最大公约数分数加法a/b c/d (a*d c*b) / (b*d)每次累加后立即约分防止溢出求平均值将累加后的分母乘以N再进行约分符号处理确保负号在分子上分母始终为正具体计算步骤输入N初始化分子sumNum0分母sumDen1对每个分数解析分子num和分母den通分累加sumNum sumNum*den num*sumDensumDen sumDen*den用GCD约分化简求平均sumDen * N再次约分若分母为负分子分母同时取反按格式输出结果代码流程说明1. gcd函数第32-36行输入两个长整数a、b功能求最大公约数流程先取绝对值再用辗转相除法递归求解2. main函数-初始化第38-42行输入N初始化累计分子sumNum0累计分母sumDen13. main函数-分数解析与累加第44-64行循环N次读取每个分数字符串查找’/位置有则拆分分子分母无则分母为1通分公式累加分子分母每次累加后用GCD约分避免数值过大4. main函数-求平均与最终约分第66-74行sumDen乘以N求平均值再次GCD约分若分母为负分子分母同时取反保证分母为正5. main函数-输出第76-80行分母为1时只输出分子否则输出分子/分母格式代码流程图是是否否是否是否开始输入分数个数N初始化累加分子分母i小于N?读取分数字符串包含斜杠分隔符?拆分分子分母整数值为分子分母为1通分累加分子分母GCD约分化简i加1分母乘N求平均值最终GCD约分分母为负数?分子分母同时取反分母等于1?只输出分子输出分子斜杠分母结束解题流程图是否理解题目需求选择分数运算方案设计GCD约分函数设计分数输入解析逻辑设计累加算法通分加每次约分设计求平均步骤分母乘N再约分处理符号保证分母为正设计格式化输出编写完整代码用样例验证输出正确?完成检查GCD实现通分公式符号代码部分实现#includeiostream#includestring#includecstdlibusingnamespacestd;longlonggcd(longlonga,longlongb){allabs(a);bllabs(b);returnb0?a:gcd(b,a%b);}intmain(){intn;cinn;longlongsumNum0,sumDen1;for(inti0;in;i){string frac;cinfrac;longlongnum,den;size_t posfrac.find(/);if(pos!string::npos){numstoll(frac.substr(0,pos));denstoll(frac.substr(pos1));}else{numstoll(frac);den1;}sumNumsumNum*dennum*sumDen;sumDensumDen*den;longlongggcd(sumNum,sumDen);sumNum/g;sumDen/g;}sumDen*n;longlongggcd(sumNum,sumDen);sumNum/g;sumDen/g;if(sumDen0){sumNum-sumNum;sumDen-sumDen;}if(sumDen1){coutsumNumendl;}else{coutsumNum/sumDenendl;}return0;}