摘要 :本题要求编写一个分数约分程序,输入形如
分子/分母的分数,通过辗转相除法求出分子与分母的最大公约数,再将两者同时除以该公约数,输出最简分式。当分子大于分母或两者相等时,仍保持分数形式输出。
题目描述
分数可以表示为分子 / 分母的形式。编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如 6/12 可以被约分为 1/2。当分子大于分母时,不需要表达为整数又分数的形式,即 11/8 还是 11/8;而当分子分母相等时,仍然表达为 1/1 的分数形式。
输入格式:
输入在一行中给出一个分数,分子和分母中间以斜杠 / 分隔,如:12/34 表示 34 分之 12。分子和分母都是正整数(不包含0,如果不清楚正整数的定义的话)。
提示:
对于 C 语言,在 scanf 的格式字符串中加入 /,让 scanf 来处理这个斜杠。
对于 Python 语言,用 a, b = map(int, input().split('/')) 这样的代码来处理这个斜杠。
输出格式:
在一行中输出这个分数对应的最简分式,格式与输入的相同,即采用分子/分母的形式表示分数。如 5/6 表示 6 分之 5。
输入样例:
in
66/120
输出样例:
out
11/20
算法流程图
#mermaid-svg-bJ6VqgmfAlomVoqy{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-bJ6VqgmfAlomVoqy .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-bJ6VqgmfAlomVoqy .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-bJ6VqgmfAlomVoqy .error-icon{fill:#552222;}#mermaid-svg-bJ6VqgmfAlomVoqy .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-bJ6VqgmfAlomVoqy .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-bJ6VqgmfAlomVoqy .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-bJ6VqgmfAlomVoqy .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-bJ6VqgmfAlomVoqy .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-bJ6VqgmfAlomVoqy .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-bJ6VqgmfAlomVoqy .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-bJ6VqgmfAlomVoqy .marker{fill:#333333;stroke:#333333;}#mermaid-svg-bJ6VqgmfAlomVoqy .marker.cross{stroke:#333333;}#mermaid-svg-bJ6VqgmfAlomVoqy svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-bJ6VqgmfAlomVoqy p{margin:0;}#mermaid-svg-bJ6VqgmfAlomVoqy .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-bJ6VqgmfAlomVoqy .cluster-label text{fill:#333;}#mermaid-svg-bJ6VqgmfAlomVoqy .cluster-label span{color:#333;}#mermaid-svg-bJ6VqgmfAlomVoqy .cluster-label span p{background-color:transparent;}#mermaid-svg-bJ6VqgmfAlomVoqy .label text,#mermaid-svg-bJ6VqgmfAlomVoqy span{fill:#333;color:#333;}#mermaid-svg-bJ6VqgmfAlomVoqy .node rect,#mermaid-svg-bJ6VqgmfAlomVoqy .node circle,#mermaid-svg-bJ6VqgmfAlomVoqy .node ellipse,#mermaid-svg-bJ6VqgmfAlomVoqy .node polygon,#mermaid-svg-bJ6VqgmfAlomVoqy .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-bJ6VqgmfAlomVoqy .rough-node .label text,#mermaid-svg-bJ6VqgmfAlomVoqy .node .label text,#mermaid-svg-bJ6VqgmfAlomVoqy .image-shape .label,#mermaid-svg-bJ6VqgmfAlomVoqy .icon-shape .label{text-anchor:middle;}#mermaid-svg-bJ6VqgmfAlomVoqy .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-bJ6VqgmfAlomVoqy .rough-node .label,#mermaid-svg-bJ6VqgmfAlomVoqy .node .label,#mermaid-svg-bJ6VqgmfAlomVoqy .image-shape .label,#mermaid-svg-bJ6VqgmfAlomVoqy .icon-shape .label{text-align:center;}#mermaid-svg-bJ6VqgmfAlomVoqy .node.clickable{cursor:pointer;}#mermaid-svg-bJ6VqgmfAlomVoqy .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-bJ6VqgmfAlomVoqy .arrowheadPath{fill:#333333;}#mermaid-svg-bJ6VqgmfAlomVoqy .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-bJ6VqgmfAlomVoqy .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-bJ6VqgmfAlomVoqy .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bJ6VqgmfAlomVoqy .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-bJ6VqgmfAlomVoqy .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bJ6VqgmfAlomVoqy .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-bJ6VqgmfAlomVoqy .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-bJ6VqgmfAlomVoqy .cluster text{fill:#333;}#mermaid-svg-bJ6VqgmfAlomVoqy .cluster span{color:#333;}#mermaid-svg-bJ6VqgmfAlomVoqy div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-bJ6VqgmfAlomVoqy .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-bJ6VqgmfAlomVoqy rect.text{fill:none;stroke-width:0;}#mermaid-svg-bJ6VqgmfAlomVoqy .icon-shape,#mermaid-svg-bJ6VqgmfAlomVoqy .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-bJ6VqgmfAlomVoqy .icon-shape p,#mermaid-svg-bJ6VqgmfAlomVoqy .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-bJ6VqgmfAlomVoqy .icon-shape .label rect,#mermaid-svg-bJ6VqgmfAlomVoqy .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-bJ6VqgmfAlomVoqy .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-bJ6VqgmfAlomVoqy .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-bJ6VqgmfAlomVoqy :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
开始
输入分数 (分子/分母)
初始化 a=分子, b=分母
b != 0 ?
temp = b
b = a % b
a = temp
最大公约数 = a
分子 = 分子 / gcd
分母 = 分母 / gcd
输出最简分式
结束
代码部分实现
c
#include <stdio.h>
// 使用辗转相除法求两个数的最大公约数
// 算法原理:gcd(a, b) = gcd(b, a mod b),直到余数为0,此时的除数即为最大公约数
int gcd(int a, int b) {
while (b != 0) {
int temp = b; // 保存当前的除数
b = a % b; // 用当前除数除当前被除数,得到新的余数
a = temp; // 将原除数作为下一轮的被除数
}
return a; // 当b为0时,a即为最大公约数
}
int main() {
int numerator, denominator;
// 以"分子/分母"的格式输入分数,scanf中的/会被自动跳过
scanf("%d/%d", &numerator, &denominator);
// 求出分子和分母的最大公约数
int common_divisor = gcd(numerator, denominator);
// 分子分母同时除以最大公约数,得到最简分式
int simplified_num = numerator / common_divisor;
int simplified_den = denominator / common_divisor;
// 输出最简分式
printf("%d/%d\n", simplified_num, simplified_den);
return 0;
}