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.