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;
} -
02012-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. -
02012-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