ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

PTA基础编程题目集 7-33有理数加法(C++语言实现)

PTA基础编程题目集 7-33有理数加法(C++语言实现) 摘要本文是PTA编程题有理数加法的题解涵盖题目描述、输入输出格式及C语言实现展示分数通分求和与辗转相除法约分的核心算法。题目描述本题要求编写程序计算两个有理数的和。输入格式输入在一行中按照a1/b1 a2/b2的格式给出两个分数形式的有理数其中分子和分母全是整形范围内的正整数。输出格式在一行中按照a/b的格式输出两个有理数的和。注意必须是该有理数的最简分数形式若分母为1则只输出分子。输入样例1/3 1/64/3 2/3输出样例1/22解题思路核心问题分析本题需要计算两个分数的和并输出最简形式。核心难点在于一是正确解析带斜杠的输入格式如1/3 1/6二是分数相加后的约分处理。例如1/3 1/6 6/18 3/18 9/18约分后为1/2。算法原理说明分数加法公式a1/b1 a2/b2 (a1×b2 a2×b1) / (b1×b2)约分算法使用辗转相除法欧几里得算法求分子和分母的最大公约数GCD然后分子分母同时除以GCD得到最简分数。辗转相除法原理gcd(a, b) gcd(b, a mod b)当b0时a即为最大公约数。时间复杂度O(log(min(a,b)))由辗转相除法的复杂度决定空间复杂度O(1)仅需几个整数变量具体计算步骤按a1/b1 a2/b2格式读取两个分数的分子和分母计算通分后的分子numerator a1×b2 a2×b1计算通分后的分母denominator b1×b2求分子和分母的最大公约数g gcd(numerator, denominator)约分numerator / gdenominator / g若分母为1只输出分子否则输出分子/分母格式代码流程说明头文件引入引入iostream和cstdio头文件定义gcd函数递归实现辗转相除法求最大公约数定义变量a1、b1、a2、b2分别存储两个分数的分子和分母读取输入使用scanf按%d/%d %d/%d格式解析带斜杠的输入计算和按分数加法公式计算分子和分母求GCD调用gcd函数求分子分母的最大公约数约分分子分母分别除以最大公约数输出结果判断分母是否为1选择输出格式程序结束return 0代码流程图是否是否开始定义gcd递归函数定义四个整数变量存分数按格式读取两个分数按通分公式计算分子按通分公式计算分母调用gcd求最大公约数分子或分母为负?g取绝对值分子除以g分母除以g分母等于1?只输出分子输出分子斜杠分母格式输出换行结束解题流程图是否输入两个分数解析得到四个整数按公式计算通分后的分子按公式计算通分后的分母求分子分母的最大公约数分子分母同时除以最大公约数分母等于1?只输出分子输出分子斜杠分母完成代码部分实现#includeiostream#includecstdiousingnamespacestd;intgcd(inta,intb){aa0?-a:a;bb0?-b:b;returnb0?a:gcd(b,a%b);}intmain(){inta1,b1,a2,b2;scanf(%d/%d %d/%d,a1,b1,a2,b2);intnumeratora1*b2a2*b1;intdenominatorb1*b2;intggcd(numerator,denominator);numerator/g;denominator/g;if(denominator1){coutnumeratorendl;}else{coutnumerator/denominatorendl;}return0;}
返回列表