PTIT123E PTIT spoj – Số vòng

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.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *