zoukankan      html  css  js  c++  java
  • vj p1032题解

    原题叙述

    此题就是考你的高精熟练度!

    首先,要作出一个很简单的递推判断:

    从个位开始找循环,后两位的循环节必然为后一位的整数倍,依此类推,找出后K位的循环节。

    于是思路就很简明了。

    有三点需要注意:

    1.读入的时候只须记录后k位,运算过程中也只须记录后k位,所以此题最多是10进制下100位的高精。

    2.记录结果的时候要注意,结果可能是高精,所以不光要设置一个不记录长度的伪*高精,还要记录一个真*高精,用于输出。

    3.如果自乘超过10次,就找不到循环了....具体为何,说实话,我说不清楚,但是大家想想9的n次方,也许能领悟到那么些东西。

    好,代码如下:

      1 type
      2         arra=record
      3                 da:array[0..210]of longint;
      4                 l:longint;
      5         end;
      6 var
      7         k:longint;n,r:arra;
      8 function min(a,b:longint):longint;
      9 begin
     10         if a<then exit(a) else exit(b);
     11 end;
     12 procedure init;
     13 var
     14         s,s1,s2:string;
     15         t,q,c,b,i:longint;
     16 begin
     17         
     18         readln(s);
     19         fillchar(n,sizeof(n),0);
     20         t:=pos(' ',s);
     21         val(copy(s,t+1,length(s)-t),k);
     22         s1:=copy(s,1,t-1);
     23         if k>length(s1) then q:=length(s1) else q:=k;
     24         for i:=1 to q do
     25                 begin
     26                         n.da[i]:=ord(s1[length(s1)-i+1])-ord('0');
     27                 end;
     28         n.l:=k;
     29         fillchar(r,sizeof(r),0);
     30         for i:=1 to n.l do r.da[i]:=n.da[i];
     31         r.l:=k;
     32         while (r.da[r.l]=0)and(r.l>1do dec(r.l);
     33 end;
     34 function check(a,r:arra;k:longint):boolean;
     35 var
     36         i:longint;
     37 begin
     38         for i:=1 to k do
     39                 begin
     40                         if a.da[i]<>r.da[i] then exit(false);
     41                 end;
     42         exit(true);
     43 end;
     44 procedure mult(a,b:arra;var r:arra);
     45 var
     46         i,j:longint;c:arra;
     47 begin
     48         fillchar(r,sizeof(r),0);
     49         fillchar(c,sizeof(c),0);
     50         for i:=1 to min(a.l,k) do
     51                 for j:=1 to min(b.l,k) do
     52                         begin
     53                                 c.da[i+j-1]:=a.da[i]*b.da[j]+c.da[i+j-1];
     54                                 if c.da[i+j-1]>=10 then
     55                                         begin
     56                                                 c.da[i+j]:=(c.da[i+j-1div 10)+c.da[i+j];
     57                                                 c.da[i+j-1]:=c.da[i+j-1mod 10;
     58                                         end;
     59                         end;
     60         for i:=1 to k do r.da[i]:=c.da[i];
     61         r.l:=k;
     62 end;
     63 procedure accmult(a:arra;b:longint;var c:arra);
     64 var
     65         i:longint;
     66 begin
     67         fillchar(c,sizeof(c),0);
     68         c.l:=a.l+2;
     69         for i:=1 to c.l do
     70                         begin
     71                                 c.da[i]:=a.da[i]*b+c.da[i];
     72                                 if c.da[i]>=10 then
     73                                         begin
     74                                                 c.da[i+1]:=(c.da[i] div 10)+c.da[i+1];
     75                                                 c.da[i]:=c.da[i] mod 10;
     76                                         end;
     77                         end;
     78         while (c.da[c.l]=0)and(c.l>1do dec(c.l);
     79 end;
     80 procedure find;
     81 var
     82         i,j,times:longint;b:boolean;c,m,d,z:arra;
     83 begin
     84 
     85         fillchar(c,sizeof(c),0);
     86         m:=n;
     87         c.l:=k;
     88         fillchar(z,sizeof(z),0);
     89         z.l:=1;z.da[1]:=1;
     90         if (r.l=1)and(r.da[1]=0then
     91                 begin
     92                         writeln(1);
     93                         halt;
     94                 end
     95         else
     96           for i:=1 to k do
     97                 begin
     98 
     99                         times:=1;
    100                         repeat
    101                                 c:=r;
    102                                 mult(r,n,r);
    103                                 mult(c,m,d);
    104                                 inc(times);
    105                                 b:=check(m,d,i);
    106                         until (b)or(times>10);
    107                         if b then
    108                                 begin
    109                                         accmult(z,times-1,z);
    110                                         n:=c;
    111                                         r:=c;
    112                                         n.l:=k;
    113                                 end
    114                         else
    115                                 begin
    116                                         writeln(-1);
    117                                         halt;
    118                                 end;
    119                 end;
    120         for i:=z.l downto 1 do write(z.da[i]);
    121 
    122 end;
    123 begin
    124         init;
    125         find;
    126 end.
  • 相关阅读:
    TypeError: expected string or bytes-like object
    Python之DataFrame更改列名及重排列顺序
    重启nginx 分类: ubuntu 测试 虚拟机 2014-12-12 11:50 126人阅读 评论(0) 收藏
    virtualbox下ubuntu调整分辨率的方法(给力!!!) 分类: ubuntu 虚拟机 2014-12-04 14:01 223人阅读 评论(0) 收藏
    安装Chrome driver/ IE driver 分类: python基础学习 2014-08-15 11:38 1328人阅读 评论(0) 收藏
    Python的静态方法和类成员方法 分类: python基础学习 2014-08-13 14:21 205人阅读 评论(0) 收藏
    linux 修改系统时间 分类: ubuntu 2014-07-28 12:04 209人阅读 评论(0) 收藏
    详解python linecache模块读取文件的方法 分类: python Module 2014-07-21 18:32 1057人阅读 评论(0) 收藏
    解决 WindowsError: [Error 87] 分类: 问题总结 2014-04-09 22:21 1266人阅读 评论(0) 收藏
    静态方法 分类: python基础学习 2014-04-05 19:34 228人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/waterfalleagle/p/1599415.html
Copyright © 2011-2022 走看看