USACO Section 2.4 Fractions to Decimals - 思维不要局限..问题想简单点..

本文探讨了如何通过编程解决将循环小数转换为分数的问题,提出了一种利用模拟除法的方法来找到循环节,并最终输出转换后的分数形式。文中详细解释了算法实现过程,并给出了相应的代码示例。

开始这题我是想到的是以前奥数学的那种把循环小数化分数的...那么分母就应该是(99...00)的形式..既然如此..那么找到能被分母整除的最小(99...00)...然后再算出对应的分子..再展开成循环小数...真的很eggache阿...写了一大段..结果都没调出来..

再一想..其实这题只要手动模拟做除法..每次记下除数和余数..再找到有相同余数的就可以了~~而且题目所给的范围<=100000..而根据鸽巢原理,最多要做的模拟运算时100001..表示完全能接受..

有点恶心的输出...要注意...

Program:

/* ID: zzyzzy12 LANG: C++ TASK: fracdec */ #include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<stack> #include<algorithm> #include<queue> using namespace std; int x,y,g; int gcd(int x,int y) { if (y==0) return x; return gcd(y,x%y); } void getanswer() { int p,t,i,a[100001],b[100001],num,n; long long k; memset(b,-1,sizeof(b)); if (x/y>0) n=(int)log10(x/y)+2; else n=2; printf("%d.",x/y); x%=y; if (y==1) { printf("0\n"); return; } t=x; num=0; b[x]=0; while (1) { t*=10; a[++num]=t/y; t-=a[num]*y; if (t==0) break; if (b[t]>=0) { p=b[t]; break; } b[t]=num; } if (t!=0) { for (i=1;i<=p;i++) { printf("%d",a[i]); n++; if (n%76==0) printf("\n"); } printf("("); n++; if (n%76==0) printf("\n"); for (i=p+1;i<=num;i++) { printf("%d",a[i]); n++; if (n%76==0) printf("\n"); } printf(")"); }else for (i=1;i<=num;i++) { printf("%d",a[i]); n++; if (n%76==0) printf("\n"); } if (n%76) printf("\n"); } int main() { freopen("fracdec.in","r",stdin); freopen("fracdec.out","w",stdout); scanf("%d %d",&x,&y); g=gcd(x,y); x/=g; y/=g; getanswer(); return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值