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.