3 条题解
- 
  0maxdumbledore LV 9 @ 2015-10-12 11:34:01 不太清楚乘以2取整有没有风险,还是正常做吧,先转为分数,再作二进制除法 ###Block code #include<cstdio> 
 #include<cstring>
 using namespace std;char s[15],ans[1000005]; 
 int pre,cut,i,a,t=1,b,k,hash[1000005],p;int main() 
 {
 scanf("%s",s);
 for(i=2;s[i]!='(';i++)
 {
 pre=pre*10+s[i]-'0';
 t*=10;
 }
 for(cut=pre,i++;s[i]!=')';i++)
 {
 cut=cut*10+s[i]-'0';
 b=b*10+9;
 }
 a=cut-pre;
 b=t*b;
 do
 {
 hash[a%=b]=++p;
 a*=2;
 ans[p]=a/b+'0';
 }while(!hash[a%b]);
 printf("0.");
 for(int j=1;j<hash[a%b];j++)
 putchar(ans[j]);
 putchar('(');
 printf("%s",ans+hash[a%b]);
 putchar(')');
 return 0;
 }
- 
  0@ 2012-10-29 22:58:10├ 测试数据 01:答案正确... (0ms, 13288KB) 
 ├ 测试数据 02:答案正确... (0ms, 13288KB)
 ├ 测试数据 03:答案正确... (0ms, 13288KB)
 ├ 测试数据 04:答案正确... (0ms, 13288KB)
 ├ 测试数据 05:答案正确... (0ms, 13288KB)
 ├ 测试数据 06:答案正确... (0ms, 13288KB)
 ├ 测试数据 07:答案正确... (0ms, 13288KB)
 ├ 测试数据 08:答案正确... (0ms, 13288KB)
 ├ 测试数据 09:答案正确... (0ms, 13288KB)
 ├ 测试数据 10:答案正确... (0ms, 13288KB)---|---|---|---|---|---|---|---|- 
 Accepted / 100 / 0ms / 13288KBvar 
 a,b,c:array[1..1000000]of longint;
 used:array[1..1000000]of boolean;
 x1,s1,x2,s2,k,n,i:longint;
 function gcd(x,y:longint):longint;
 begin
 if x mod y=0 then exit(y)
 else gcd:=gcd(y,x mod y);
 end;
 procedure init;
 var s:char;
 begin
 read(s);read(s);
 read(s);
 x1:=0;s1:=1;
 while s'(' do
 begin
 x1:=x1*10+ord(s)-48;
 s1:=s1*10;
 read(s);
 end;
 read(s);
 x2:=0;
 s2:=0;
 while s')' do
 begin
 x2:=x2*10+ord(s)-48;
 s2:=s2*10+9;
 read(s);
 end;
 a[1]:=s2*x1+x2;
 b[1]:=s1*s2;
 k:=gcd(a[1],b[1]);
 a[1]:=a[1] div k;
 b[1]:=b[1] div k;
 end;
 begin
 init;
 write('0.');
 n:=1;
 while not odd(b[n]) do
 begin
 inc(n);
 a[n]:=a[n-1]*2;
 b[n]:=b[n-1];
 if a[n]>b[n] then begin c[n]:=1;a[n]:=a[n]-b[n];end;
 k:=gcd(a[n],b[n]);
 a[n]:=a[n] div k;
 b[n]:=b[n] div k;
 end;
 for i:=2 to n do write(c[i]);
 write('(');
 while not used[a[n]] do
 begin
 used[a[n]]:=true;
 inc(n);
 a[n]:=a[n-1]*2;
 b[n]:=b[n-1];
 if a[n]>b[n] then begin c[n]:=1;a[n]:=a[n]-b[n];write(c[n]);end else write(c[n]);
 end;
 writeln(')');
 end.
- 
  0@ 2012-10-29 18:03:14首页上的题解确实是个好方法,但是貌似实现起来比较麻烦。我这里有一个更好写的方法,主要思路是暴力*2取整,等到循环部分和非循环部分在以前出现过时,输出循环节,结束。由于只有6位,根本用不到高精度,直接模10^n即可,大水题一个,考察细节。 
 编译通过...├ 测试数据 01:答案正确... (0ms, 12312KB)├ 测试数据 02:答案正确... (0ms, 12312KB)├ 测试数据 03:答案正确... (0ms, 12312KB)├ 测试数据 04:答案正确... (0ms, 12312KB)├ 测试数据 05:答案正确... (0ms, 12312KB)├ 测试数据 06:答案正确... (0ms, 12312KB)├ 测试数据 07:答案正确... (0ms, 12312KB)├ 测试数据 08:答案正确... (0ms, 12312KB)├ 测试数据 09:答案正确... (0ms, 12312KB)├ 测试数据 10:答案正确... (0ms, 12312KB)
 ---|---|---|---|---|---|---|---|-Accepted / 100 / 0ms / 12312KBprogram T1062_1;var s:string; n,m,i,j,k,mo,moo:longint; dn,dm,rec:array[0..1000000]of longint;begin readln(s);write('0.'); k:=pos('(',s); mo:=1;moo:=1; for i:=3 to k-1 do mo:=mo*10; for i:=k+1 to length(s)-1 do moo:=moo*10; if k>3 then val(copy(s,3,k-3),n,i); val(copy(s,k+1,length(s)-k-1),m,i); rec[0]:=0; dn[0]:=n; dm[0]:=m; if k>3 then begin for i:=1 to 1000000 do begin rec[i]:=dn*2 div mo; dn[i]:=dn*2 mod mo+dm*2 div moo; dm[i]:=dm*2 mod moo+dm*2 div moo; for j:=0 to i do if (dn[i]=dn[j])and(dm[i]=dm[j]) then break; if ji then begin for k:=1 to j do write(rec[k]); write('('); for k:=j+1 to i do write(rec[k]); write(')'); halt; end; end; end else begin for i:=1 to 1000000 do begin rec[i]:=dm*2 div moo; dm[i]:=dm*2 div moo+dm*2 mod moo; for j:=0 to i do if dm[i]=dm[j] then break; if ij then begin for k:=1 to j do write(rec[k]); write('('); for k:=j+1 to i do write(rec[k]); write(')'); halt; end; end; end;end. 
- 1