Pascal - Độ Bền Số Nguyên Không Âm
Trang 1Lý thuyết độ bền số nguyên không âm
Năm 1973, nhà toán học Neil Sloan đưa ra khái niệm Độ bền của một số nguyên không âm N được định nghĩa như sau:
+ Nếu N có một chữ số thì độ bền của N bằng 0.
+ Nếu N có từ 2 chữ số trở lên thì độ bền của N bằng độ bền của số nguyên là tích các chữ số của N cộng 1.
Yêu cầu: Tìm số bé hơn N có độ bền lớn nhất.
Ví dụ: Doben(77) = 4
Giải thích: Doben(77) = Doben(49)+1 = Doben(36)+1+1 = Doben(18)+1+1+1 = Doben(8)+1+1+1+1 = 0+1+1+1+1 = 4
Bài tập Pascal
Cho N, hãy tìm số bé hơn N có độ bền lớn nhất (0 <= N <= 2.000.000.000)
Ví dụ: Cho N = 100 thì Số nhỏ hơn N và có độ bền lớn nhất là 77, Độ bền của 77 = 4
Hãy đề xuất cấu trúc dữ liệu và giải thuật thích hợp để giải bài toán trên.
Hãy viết chương trình bằng ngôn ngữ Pascal để thể hiện lời giải trên.
Giải thuật
Tạo các biến cho chương trình như sau: i, j, k, n, do_ben, max kiểu longint
{Lập hàm tính tích các chữ số của N}
function tich(biến n kiểu longint) trả về dữ liệu kiểu longint
Tạo biến kqua có kiểu dữ liệu longint
Khi n=0 thì gán biến kqua = 0 ngược lại gán biến kqua = 1
Chạy vòng lặp While khi n<>0
gán kqua = kqua * (n mod 10) gán n = n div 10
Trang 2{Chương trình chính}
Bắt đầu chương trình
Chạy vòng lặp While khi true (luôn luôn chạy) yêu cầu nhập và kiểm tra số nguyên N
Xóa dữ liệu hiển thị trên màn hình
In yêu cầu nhập số nguyên không âm N, điều kiện (0 <= N <= 2,000,000,000) Đọc dữ liệu nhập và gán vào biến n
Kiểm tra biến n (nếu lớn hơn hoặc bằng 0 và nhỏ hơn hoặc bằng 2,000,000,000) thì thoát vòng lặp While
Ngược lại thì không thoát vòng lặp While Gán biến max = 1
Chạy vòng For duyệt biến i từ 1 đến n
gán biến do_ben = 0 gán biến j = i Chạy vòng lặp While khi j>9
gán biến do_ben = do_ben + 1 gán biến j = kết quả hàm tich(j) Nếu biến do_ben lớn hơn hoặc bằng biến max thì
gán biến max = do_ben gán biến k = i
Thoát vòng For
In kết quả Số bé hơn N có độ bền lớn nhất là K
In kết quả Độ bền của K là max Thoát chương trình
Trang 3Chương trình Pascal
program Do_Ben_So_Nguyen;
uses crt;
var i,j,k:longint;
var n,do_ben,max:longint;
function tich(n:longint):longint;
var kqua:longint;
begin
if n=0 then kqua:=0 else kqua:=1;
while n<>0 do
begin
kqua:=(kqua*(n mod 10));
n:=(n div 10);
end;
tich:=kqua;
end;
begin
while true do
begin
clrscr;
write('Nhap so nguyen khong am N (0 <= N <= 2,000,000,000): ');
readln(n);
if (n>=0) and (n<=2000000000) then break;
end;
Trang 4for i:=1 to n do
begin
do_ben:=0;
j:=i;
while j>9 do begin
do_ben:=do_ben+1;
j:=tich(j);
end;
if do_ben>=max then begin
max:=do_ben;
k:=i;
end;
end;
writeln('So be hon N co do ben lon nhat la: ',k);
writeln('Do ben cua ',k,' la: ',max);
end