其他分享
首页 > 其他分享> > 遇到一道有意思的题目,在此分享一下

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

作者:互联网

约分最简分式

分数可以表示为分子/分母的形式。编写一个程序,要求用户输入一个分数,然后将其约分为最简分式。最简分式是指分子和分母不具有可以约分的成分了。如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