Hiển thị kết quả từ 1 đến 9 / 9
  1. #1
    Tham gia
    31-01-2007
    Location
    TX Vị Thanh
    Bài viết
    82
    Like
    0
    Thanked 0 Times in 0 Posts

    Số thập phân vô hạn tuần hoàn...

    Vô tình mình được 1 bạn "đày đọa nhẹ nhàng" bằng cái đề như sau:
    input: m,n số nguyên
    Output: m/n có phải là thập phân vô hạn tuần hoàn k? Biểu diễn chúng
    Ví dụ 4/3=1.333=1.(3) thì phải...
    Code:
    program TPVHTH;
    uses crt;
    var a:array [1..100] of longint;
        n,m,k1,t1,k:longint;
         kt:boolean;
        s,s1,ss:string;
        kq:real;
                    procedure process;
                      var i:integer;
                      begin
                        i:=1;
                          repeat
                              if n>=m then
                                begin
                                  a[i]:=n div m;
                                  n:=n-(a[i]*m);
                                  inc(i);
                                end
                            else
                             begin
                               a[i]:=0;
                               inc(i);
                             end;
                            n:=n*10;
                         until (i=11)or(n=0);
                      end;
                   procedure tinh;
                     var i,k:integer;
                     begin
                     i:=0; kt:=true;
                     repeat
                       for k:=t1 to t1+1 do
                          begin
                           str(a[k],s1);
                           ss:=ss+s1;
                           inc(i);
                           if s[i]<>s1 then kt:=false;
                          end;
                        s:=ss;
                        ss:='';
                        i:=0;
                        t1:=t1+k1;
                     until (kt=false)or(k=10-k1+1);
                      if kt then write('Thuong La So Thap Phan Vo Han Tuan Hoan')
                       else write('Khong La So Thap Phan Vo Han Tuan Hoan');
                     end;
                   procedure xuli1;
                     var t,i:integer; s1:string;
                     begin
                         t:=a[10]; str(a[10],s1);
                         s:=s+s1;
                        for i:=10 downto 2 do
                         if t<>a[i] then
                           begin
                            str(a[i],s1);
                            s:=s+s1;
                           end
                           else
                          break;
                        k1:=length(s); kt:=true;
                         if k1=1 then
                            begin
                               for k:=10 downto 6 do
                                  begin
                                    str(a[k],s1);
                                    if s[k1]<>s1 then kt:=false;
                                  end;
                            end;
                         if kt=false then
                           begin
                             s1:='';
                             s:='';
                           end;
                     end;
                     procedure xuli2;
                       var t,i:integer;
                       begin
                          t:=a[2]; str(a[2],s1);
                            s:=s+s1;
                             for i:=3 to 10 do
                               if t<>a[i] then
                                 begin
                                  str(a[i],s1);
                                  s:=s+s1;
                                 end
                            else
                               break;
                         k1:=length(s);
                         t1:=k1+2;
                         tinh;
                        end;
    
    begin
    clrscr;
         write('Nhap n =');readln(n);
         write('Nhap m =');readln(m);
      if n mod m =0 then write('Thuong Khong Phai So Thap Phan Vo Han Tuan Hoan')
      else
       begin
      process;
        xuli1;
        if kt then write('Thuong La So Thap Phan Vo Han Tuan Hoan')
        else
        xuli2;
      end;
    readln;
    end.
    Mình sử dụng cách ăn gian lận thôi, bài này mà test full thì thua chắc rồi, các bạn sửa lại dùm và cho dùm phân tích nhé...
    Thanh kìu mẹt xi vé ri nhiều!
    Quote Quote

  2. #2
    Tham gia
    13-12-2008
    Location
    Vũng Tàu
    Bài viết
    393
    Like
    0
    Thanked 2 Times in 2 Posts
    Code:
    const fi='phepchia.inp';
          fo='phepchia.out';
          max=1000000;
    var   f:text;
          n,k,i,j:longint;
          a,b:array[0..max] of longint;
    procedure inp;
    begin
          assign(f,fi);
          reset(f);
          readln(f,n,k);
          close(f);
    end;
    procedure test;
    begin
          a[0]:=n mod k;
          b[0]:=n div k;
          for i:=1 to max do
          begin
               a[i]:=(a[i-1]*10) mod k;
               b[i]:=(a[i-1]*10) div k;
               for j:=0 to i-1 do
                    if a[j]=a[i] then
                    begin
                         exit;
                    end;
          end;
          if i=max then j:=i;
    end;
    procedure pri;
    var   h,k:longint;
    begin
          assign(f,fo);
          rewrite(f);
          write(f,b[0]);
          if a[0]<>0 then write(f,'.')
          else
             begin
                  close(f);
                  exit;
             end;
          for h:=1 to j do write(f,b[h]);
          if (a[j]=0) or (i=j) then
             begin
                  close(f);
                  exit;
             end;
          if i<250 then write(f,'(');
          for h:=j+1 to i do
          begin
             write(f,b[h]);
             if h>250 then
             begin
                close(f);
                exit;
             end;
          end;
          write(f,')');
          close(f);
    end;
    begin
          inp;
          test;
          pri;
    end.
    xem ra thì hem ai bàn luận về bài này ........

  3. #3
    Tham gia
    28-09-2007
    Location
    Vĩnh Yên-Vĩnh Phúc
    Bài viết
    1,167
    Like
    6
    Thanked 14 Times in 12 Posts
    Quote Được gửi bởi lehuukyquan View Post
    Vô tình mình được 1 bạn "đày đọa nhẹ nhàng" bằng cái đề như sau:
    input: m,n số nguyên
    Output: m/n có phải là thập phân vô hạn tuần hoàn k? Biểu diễn chúng
    Ví dụ 4/3=1.333=1.(3) thì phải...
    nếu m chia hết cho n thì không phải.
    tìm tất cả ước của n, nếu chỉ có 2 và 5 thì cũng không phải.
    nếu là phải, biểu diễn m/n thành 1 xâu rồi dùng hàm pos để tìm phần lặp lại(theo kiểu vét cạn, nhưng khi tìm được rồi thì thôi).

  4. #4
    Tham gia
    13-12-2008
    Location
    Vũng Tàu
    Bài viết
    393
    Like
    0
    Thanked 2 Times in 2 Posts
    Quote Được gửi bởi huysun View Post
    nếu m chia hết cho n thì không phải.
    tìm tất cả ước của n, nếu chỉ có 2 và 5 thì cũng không phải.
    nếu là phải, biểu diễn m/n thành 1 xâu rồi dùng hàm pos để tìm phần lặp lại(theo kiểu vét cạn, nhưng khi tìm được rồi thì thôi).
    - n lên tới 10^6 , vét k tối ưu lắm
    - đính chính đề 1 tí : hãy thực hiện fép chia n cho m ( kết quả biểu diễn ở hệ thập fân hữu hạn hoặc vô hạn tuần hoàn , nếu k tuần hoàn thì in ra 250 số fần thập fân )
    vd: inp
    5 7
    out
    0.(714285)

  5. #5
    Tham gia
    27-05-2008
    Location
    bình định
    Bài viết
    692
    Like
    0
    Thanked 10 Times in 6 Posts
    bài hay lắm , nhưng mình không quen thao tác với mấy con số real,
    nhưng thuật toán như trên chắc là okie rồi

  6. #6
    Tham gia
    28-10-2015
    Bài viết
    1
    Like
    0
    Thanked 0 Times in 0 Posts
    nếu số dạng 0,( 000009) thì in ra sao

  7. #7
    Tham gia
    27-01-2016
    Location
    THCS Phan Đăng Lưu
    Bài viết
    57
    Like
    1
    Thanked 92 Times in 39 Posts
    Bài hay đấy ,làm thì sẽ ra

  8. #8
    Tham gia
    01-07-2012
    Bài viết
    122
    Like
    10
    Thanked 27 Times in 26 Posts
    Nếu mẫu số = 2^a * 5^b * m thì chu kì bắt đầu từ chữ số max(a,b)+1. Độ dài chu kì là nghiệm min của pt 10^x mod m = 1.

  9. #9
    Tham gia
    22-05-2017
    Bài viết
    12
    Like
    1
    Thanked 1 Time in 1 Post
    Có một định nghĩa toán học về số vô hạn tuần hoàn: Nếu mẫu số có 1 ước nguyên tố khác 2 và 5 thì đó là số thập phân vô hạn tuần hoàn.
    Bạn phân tích mẫu số ra thừa số nguyên tố, rồi kiểm tra xem có thừa số ngtố nào khác 2 và 5 không, nếu có thì in ra Yes, ngược lại No

Bookmarks

Quy định

  • Bạn không thể tạo chủ đề mới
  • Bạn không thể trả lời bài viết
  • Bạn không thể gửi file đính kèm
  • Bạn không thể sửa bài viết của mình
  •