码迷,mamicode.com
首页 > 其他好文 > 详细

USACO training 2.4.5 Fractions to Decimals题解

时间:2015-02-25 12:56:13      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:

嗯...用到一个定理,对于一个最简分数n/d,d=(2^x)*(5^y)*m,m≠1,那么其循环节长度为使10^L mod m==1的最小的L,不循环长度为max(x,y)

然后这题就没什么了。。

76个字符一换行比较坑,我用了stringstream...

技术分享
 1 #include<iostream>
 2 #include<sstream>
 3 #include<cstdio>
 4 #include<iomanip>
 5 #include<algorithm>
 6 #include<string>
 7 using namespace std;
 8 typedef long long LL;
 9 string s;
10 int pow_mod(int a,int b,int mod)
11 {
12     LL base=a,ans=1;
13     while(b)
14     {
15         if(b&1) ans=ans*base%mod;
16         base=base*base%mod;
17         b>>=1;
18     }
19     return (int)ans;
20 }
21 int gcd(int a,int b)
22 {
23     return b==0?a:gcd(b,a%b);
24 }
25 int x,y,m,n,d;    // n/d d=2^x * 5^y * m
26 int main()
27 {
28     freopen("fracdec.in","r",stdin);
29     freopen("fracdec.out","w",stdout);
30     stringstream ss;
31     cin>>n>>d;
32     int g=gcd(n,d);
33     n/=g;d/=g;
34     m=d;
35     while(m>1 && (m&1)==0) m>>=1,++x;
36     while(m>1 && (m%5)==0) m/=5,++y;
37     if(m==1) 
38     {
39         if(n%d==0) ss<<n/d<<".0";
40         else ss<<setprecision(max(x,y))<<setiosflags(ios::fixed)<<(double)n/(double)d;
41     }
42     else
43     {
44         int i;
45         for(i=1;;++i) if(pow_mod(10,i,m)==1) break;
46         //printf("%d\n",i);
47         ss<<n/d<<.;
48         n%=d;
49         for(int j=0;j<max(x,y)+i;++j)
50         {
51             if(j==max(x,y)) ss<<(;
52             n*=10;
53             ss<<n/d;
54             n%=d;
55         }
56         ss<<);
57     }
58     ss>>s;
59     int sz=s.length();
60     for(int i=0;i<sz;++i)
61     {
62         if(i%76==0 && i!=0) putchar(10);
63         putchar(s[i]);
64     }
65     putchar(10);
66     return 0;
67 }
View Code

 

USACO training 2.4.5 Fractions to Decimals题解

标签:

原文地址:http://www.cnblogs.com/lowsfish/p/4299410.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!