Nguồn đề bài: http://www.spoj.com/PTIT/problems/PTIT123E/
1. Đề bài PTIT123E PTIT spoj
Một số vòng là một số nguyên có n chữ số, khi nhân số đó với các số từ 1 đến n, ta được số mới thỏa mãn: Nếu như chọn các chữ số từ một vị trí nào đó rồi vòng lại (đến trước chữ số đầu tiên chọn) ta được số đã cho ban đầu. Ví dụ:
Số 142857 là số vòng, vì:
142857 × 1 = 142857
142857 × 2 = 285714
142857 × 3 = 428571
142857 × 4 = 571428
142857 × 5 = 714285
142857 × 6 = 857142
Viết chương trình xác định xem một số có phải số vòng hay không.
Input
Mỗi bộ test trên một dòng chưa một số nguyên duy nhất có từ 2 đến 60 chữ số. Lưu ý: Các số có thể có các số 0 ở đầu, và không được xóa bỏ các số 0 này, nó là một phần của số và cũng được tính trong việc xác định độ dài của số. Ví dụ: “01” là số có 2 chữ số, nó khác với “1” có một chữ số.
Output
Với mỗi bộ test, in trên một dòng xác định xem số đó có phải là số vòng hay không?
Nếu là số vòng in ra “Số_của_bộ_test_tương_ứng is cyclic”.
Ngược lại in ra “Số_của_bộ_test_tương_ứng is not cyclic”.
Xem ví dụ sau để biết rõ hơn về định dạng in ra.
Example
Input:
142857
142856
142858
01
0588235294117647
Output:
142857 is cyclic
142856 is not cyclic
142858 is not cyclic
01 is not cyclic
0588235294117647 is cyclic
2. Hướng dẫn PTIT123E PTIT spoj
– Bài này đề cho gì làm đó thôi. nhưng vì số chữ số là 60 nên phải áp dụng xử lí số nguyên lớn.
3. Code tham khảo PTIT123E PTIT spoj
const fi=''; nmax=60; type data=longint; var f:text; s,vongtron:ansistring; function add(a,b:ansistring):ansistring; var c:ansistring; i,carry,s:data; begin while length(a)<length(b) do a:='0'+a; while length(b)<length(a) do b:='0'+b; carry:=0; c:=''; for i:=length(a) downto 1 do begin s:=ord(a[i])+ord(b[i])-2*48+carry; if s>=10 then begin dec(s,10); carry:=1; end else carry:=0; c:=chr(s+48)+c; end; if carry<>0 then c:='1'+c; exit(c); end; function nhan(a:ansistring; b:data):ansistring; var i,j,nho,er:data; c,tmp:ansistring; begin c:=''; nho:=-1; for i:=length(a) downto 1 do begin str((ord(a[i])-48)*b,tmp); inc(nho); for j:=1 to nho do tmp:=tmp+'0'; c:=add(c,tmp); end; while (length(c)>1) and (c[i]='0') do delete(c,1,1); exit(c); end; procedure xuli; var i,j:data; tich:ansistring; begin vongtron:=s+s+s+s; for i:=1 to length(s) do begin tich:=nhan(s,i); if pos(tich,vongtron)=0 then begin writeln(s,' is not cyclic'); exit; end; end; writeln(s,' is cyclic'); end; procedure docfile; var i,j:data; begin assign(f,fi); reset(f); while (not seekeof(f)) or (not eof(f)) do begin readln(f,s); xuli; end; close(f); end; begin docfile; end.