ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

遇到一道有意思的题目,在此分享一下

2021-12-03 22:06:12  阅读:162  来源: 互联网

标签:分子 分数 有意思 题目 int 最简 公约数 分享 分母


约分最简分式

分数可以表示为分子/分母的形式。编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如6/12可以被约分为1/2。当分子大于分母时,不需要表达为整数又分数的形式,即11/8还是11/8;而当分子分母相等时,仍然表达为1/1的分数形式。

输入格式:

输入在一行中给出一个分数,分子和分母中间以斜杠/分隔,如:12/34表示34分之12。分子和分母都是正整数

输出格式:

在一行中输出这个分数对应的最简分式,格式与输入的相同,即采用分子/分母的形式表示分数。如 5/6表示6分之5。

输入样例:

66/120

输出样例:

11/20

我的思路是,当分子分母任意一者为素数且无法相互整除时,约分就完成了。

以下 : 

#include<stdio.h>
#include<math.h>

int main()
{
	int son,mother;//分子和分母,很好理解对吧
	scanf("%d/%d",&son,&mother);

	int i,j,sign=0;//i:分子和分母的公约数,j:循环判定分子和分母是否为素数(我重复用了两次)
                   //sign: 用于离开“公约数(i)”循环

	for(i=2;sign==0;i++)//公约数i取1没有意义,直接定义为2
	{
		int judge1=1,judge2=1;//judge1:判定分子是否为素数,judge2:判定分母是否为素数
		
		while(son%i==0&&mother%i==0)//当i确实是公约数时,分子分母同时整除,直到无法整除为止
		{
			son/=i;
			mother/=i;
		}
		
		for(j=2;j<=sqrt(son);j++)//这个素数判定比较经典了,不明白可以百度一下
			if(son%j==0)
			{
				judge1=0;
				break;
			}

		for(j=2;j<=sqrt(mother);j++)
			if(mother%j==0)
			{
				judge2=0;
				break;
			}

		if(judge1||judge2)//当分子分母二者任意一者为素数时,可以进行输出准备了。
                          //当分子分母任意一者为素数时,除非另一者可以正好整除
                          //这个素数,否则就已经无法再约分了

			if(mother%son!=0&&son%mother!=0)//这里是直接输出的分支,也就是分子分母其中一者为
			{                               //素数,且另一者无法整除。因为不确定分子分母大小
				printf("%d/%d",son,mother); //关系,所以要保证哪种情况都无法整除。
				sign=1;
			}
			else if(mother%son==0)//这里是可以素数整除的情况1:分母比分子大
			{                     
				printf("%d/%d",son/son,mother/son);
				sign=1;
			}
			else if(son%mother==0)//这里是可以素数整除的情况2:分母比分子小
			{
				printf("%d/%d",son/mother,mother/mother);
				sign=1;
			}//这三个分支判断都有一个sign=1,正是输出完毕的标志,如果程序没进入分支判断,
             //那么sign一直为0,“公约数”循环继续(其实sign是为了满足单出口原则设立的。。。)
	}
	return 0;
}

如果对您有所帮助,那真是再好不过;如果您觉得我还有可改进的地方,还请指点一二。

标签:分子,分数,有意思,题目,int,最简,公约数,分享,分母
来源: https://blog.csdn.net/m0_62349134/article/details/121707303

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有