嗯...用到一个定理,对于一个最简分数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 }
时间: 2024-12-29 11:49:59