题解

3 条题解

  • 0
    @ 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 / 13288KB

    var

    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 / 12312KB

    program 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

信息

ID
1748
难度
6
分类
数论 | 模拟 点击显示
标签
(无)
递交数
413
已通过
110
通过率
27%
被复制
3
上传者