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!
Bookmarks