P148PROA spoj PTIT – Dãy số Hailstone

Nguồn đề bài: http://www.spoj.com/PTIT/problems/P148PROA/

1. Đề bài P148PROA spoj

Dãy số Hailstone bắt đầu từ một số tự nhiên N cho trước, các số tiếp theo sẽ được tạo theo quy tắc:
• Nếu số hiện tại là chẵn thì số tiếp theo sẽ bằng số đó chia cho 2.
• Nếu số hiện tại là lẻ thì số tiếp theo sẽ được nhân lên 3 lần rồi cộng 1
• Khi gặp số 1 thì dãy số kết thúc.

Ví dụ, với N = 3 thì dãy số Hailstone tương ứng sẽ là: 3, 10, 5, 16, 8, 4, 2, 1

Bài toán đặt ra là cho trước N, hãy tính chiều dài của dãy Hailstone tương ứng.

Input

Mỗi bộ test ghi trên một dòng số N không quá 100. Input kết thúc với N = 0.

Output

Với mỗi bộ test, ghi ra màn hình duy nhất một số nguyên là kết quả bài toán.

Example

Input:
1
2
3
0

Output:
1
2
8

2. Giải thích code mẫu P148PROA spoj PTIT

– Dùng procedure sinh để tạo sẳn đáp án cho bài.

3. code tham khảo P148PROA spoj PTIT

const   fi='';
        D:array[1..100] of longint=(

        1, 2, 8, 3, 6, 9, 17, 4, 20, 7, 15, 10, 10, 18, 18, 5, 13, 21, 21, 8, 8,
16, 16, 11, 24, 11, 112, 19, 19, 19, 107, 6, 27, 14, 14, 22, 22, 22, 35,
9, 110, 9, 30, 17, 17, 17, 105, 12, 25, 25, 25, 12, 12, 113, 113, 20, 33,
20, 33, 20, 20, 108, 108, 7, 28, 28, 28, 15, 15, 15, 103, 23, 116, 23, 15,
23, 23, 36, 36, 10, 23, 111, 111, 10, 10, 31, 31, 18, 31, 18, 93, 18, 18,
106, 106, 13, 119, 26, 26, 26


        );
var
        n:longint;
        f:text;

procedure sinh;
var     a,b:longint;
        i,dem:longint;
begin
        assign(f,'c:data.txt'); rewrite(f);
        for i:=1 to 100 do
                begin
                        a:=i;
                        dem:=1;
                        while a<>1 do
                                begin
                                        if a mod 2=0 then
                                                a:=a div 2
                                        else
                                                a:=a*3+1;
                                        inc(dem);
                                end;
                        write(f,dem,', ');
                end;
        close(f);
end;

begin
        assign(f,fi); reset(f);
        repeat
                readln(f,n);
                if n =0 then break;
                writeln(D[n]);
        until false;
        close(f);
        //sinh;
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 *