本文主要是介绍poj 1930 (循环小数转化分数),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
#include<stdio.h>
#include<string.h>
long int Tpow[10];
long int gcd(long int a, long int b) //辗转相除法
{
if(b==0)
return a;
else
return gcd(b,a%b);
}
void init(void) //预先计算了10的n次方,放入Tpow数组里
{
int i;
Tpow[0]=1;
for(i=1;i<10;i++)
{
Tpow[i]=Tpow[i-1]*10;
// printf("%d\n",Tpow[i]);
}
}
int main(void)
{
char str[200];
long int ans,a,b,c,temp,mina,minb,t,i;
init();
while(~scanf("%s",str))
{
if(str[0]=='0'&&strlen(str)==1)
break;
ans=0;
t=0;
mina=-1;minb=-1;
for(i=2;str[i]!='.';i++) // 把字符串转化成一个整数好计算 i从2开始,是因为忽略了前面的0.
{
ans=ans*10+str[i]-'0';
t++;
}
// printf("ans=%d t=%d\n",ans,t);
for(i=t;i>0;i--)
{
c=ans;
b=Tpow[t-i]*(Tpow[i]-1); // 计算分母 其中t-i代表上面的m i代表上面的nc=c/Tpow[i]; // 这时算出的c就是上面的β ,而上面的10^m*β+α就是ans
a=ans-c; //计算分子
temp=gcd(a,b);
// printf("a=%d b=%d temp=%d\n",a,b,temp);
if(b/temp<minb||mina==-1)
{
mina=a/temp;
minb=b/temp;
}
}printf("%d/%d\n",mina,minb);
}
}
这篇关于poj 1930 (循环小数转化分数)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!