/*算法是这样 :
①:获取小数num小数点后有i位。 例如num=2.5,则i=1;
②:于是分数就可以写成为num*10^i/10^i (10^i表示10的i次方)
③:化简,分子分母分除以最大公约数
*/
#include
int ten(int n) //求10的n次方的值
{
int sum=1;
for(int i=0;i sum=sum*10; return sum; } int gcd(int d,int f)//求两个数的最大公约数,用的是辗转相除法 { int r,temp; if(d { temp=d; d=f; f=temp; } while(f!=0) { r=d%f; if (r { d=f; f=r; } else d=r; } return d; } void main() //主函数 { float numF;//输入的小数 int numI;//小数的整数部分 int k;//最大公约数 int i=0;//小数的位数 scanf("%f",&numF); numI=numF; //c语言中,浮点型赋给整型时,只取其整数部分, //所以可以用这个方法获取小数的整数部分 while(numF-numI>0)//下面是关键算法,将小数逐步乘以10 //当且仅当小数减去它的整数部分=0,它才 //变成了整数 { numF=numF*10; numI=numF; i=i+1; } k=gcd(numI,ten(i));//最大公约数 printf("%d/%d",numI/k,ten(i)/k);//最后输出 }
你可以设分母为X等于1
那么2.5X/X = 2.5
X不断递增,直到2.5X不是一个小数就OK了
判断是不是小数的方法:令其乘二,再整除二,看是否等于原先那个数,如果是,那么就不是小数了
2.5=2.5/1
=(2.5*10)/(1*10)
=25/10
=5/2