Bài tập Pascal

1. Cho số nguyên dương N a)Đếm số ước của N b) Tính tổng các ước của N
2. Người ta định nghĩa một số nguyên dương N được gọi là số đẹp nếu N thoả mãn một trong hai ñiều kiện sau:
- N bằng 9
- Gọi f(N) là tổng các chữ số của N thì f(N) cũng là số đẹp Cho số nguyên dương N (N < = 10^100 ), hãy kiểm tra xem N có phải là số đẹp không?

3. Tìm K chữ số cuối cùng của M^N (0< K < = 9, 0 < = M, N < = 10^6)
Cho $N (N \leq 10)$ nguyên dương a1, a2, … , an < = 10^9 . Tìm ước số chung lớn nhất, bội số chung nhỏ nhất của n số trên
4.Cho N là một số nguyên dương không vượt quá 10^9 .Hãy tìm số chữ số 0 tận cùng của N
5.Hãy đếm số cách đặt k quân xe lên bàn cờ n x n sao cho không có quân nào ăn được nhau (1 < = k < = n < =100).
6. Tính số ước và tổng các ước của N!
 

tengiday

Happy life
Mấy bài của bạn có vẻ nghiêng về toán rất nặng.
Bài 1: Đây là bài tập cơ bản. Bạn cần duyệt i từ 2 tới sqrt(n) rồi kiểm tra n mod i.

Bài 2: Tổng các chữ số của 1 số N chính là N mod 9. Như vậy bài này ta chỉ cần tìm N mod 9 là xong. Thuật toán tính N mod 9 nếu N là số lớn như sau:
Mã:
Với từng chữ số N[i] của N
   result = (result * 10 + N[i]) mod 9.

Bài 3: Bài này mục đích cần tìm chính là M^N mod 10^K. Gọi d = 10^k và lambda = 2*10^(K-1), ta có công thức:
Mã:
M^N mod d = A^B mod d,
với M mod d = A mod d   và   N mod lambda = B mod lambda.
Tư tưởng chính là vì M^N quá lớn nên ta phải thay thế M^N bằng A^B với A^B đủ nhỏ. Nhỏ tới cỡ nào thì bạn tự nghĩ xem nhé.

- Phần 2 của bài này không khó lắm vì n chỉ có 10 số, hơn nữa chúng ta đã có thuật toán tìm UCLN và BCNN cực nhanh rồi.

Bài 4: Bài này chỉ cần dùng while (N mod 10 = 0).

Bài 5: Bài này mình đang xem có thể tìm đc công thức tính luôn hay là phải đệ quy quay lui.

Bài 6: Bạn nhớ lại đinh nghĩa của N! như thế nào, và ước của nó là số nào nhé.
 
Sửa lần cuối:
Mấy bài của bạn có vẻ nghiêng về toán rất nặng.
Bài 1: Đây là bài tập cơ bản. Bạn cần duyệt i từ 2 tới sqrt(n) rồi kiểm tra n mod i.

Bài 2: Tổng các chữ số của 1 số N chính là N mod 9. Như vậy bài này ta chỉ cần tìm N mod 9 là xong. Thuật toán tính N mod 9 nếu N là số lớn như sau:
Mã:
Với từng chữ số N[i] của N
   result = (result * 10 + N[i]) mod 9.

Bài 3: Bài này mục đích cần tìm chính là M^N mod 10^K. Gọi d = 10^k và lambda = 2*10^(K-1), ta có công thức:
Mã:
M^N mod d = A^B mod d,
với M mod d = A mod d   và   N mod lambda = B mod lambda.
Tư tưởng chính là vì M^N quá lớn nên ta phải thay thế M^N bằng A^B với A^B đủ nhỏ. Nhỏ tới cỡ nào thì bạn tự nghĩ xem nhé.

- Phần 2 của bài này không khó lắm vì n chỉ có 10 số, hơn nữa chúng ta đã có thuật toán tìm UCLN và BCNN cực nhanh rồi.

Bài 4: Bài này chỉ cần dùng while (N mod 10 = 0).

Bài 5: Bài này mình đang xem có thể tìm đc công thức tính luôn hay là phải đệ quy quay lui.

Bài 6: Bạn nhớ lại đinh nghĩa của N! như thế nào, và ước của nó là số nào nhé.

Bạn có thể làm cụ thể ra được không.Mình chỉ vừa mới học và tiếp xúc với môn này thôi mà BTVN đã dư lày.
Đây đều là các bài tập trong sách giáo khoa chuyên tin quyển 1.
 

tengiday

Happy life
Bạn có thể làm cụ thể ra được không.Mình chỉ vừa mới học và tiếp xúc với môn này thôi mà BTVN đã dư lày.
Đây đều là các bài tập trong sách giáo khoa chuyên tin quyển 1.
Mình nghĩ nếu là lần đầu tiếp xúc với lập trình mà đòi viết như thế này thì quá nhiều và khó nữa. Không rõ bạn có bao nhiêu thời gian, bắt đầu từ bài đầu tiên, bạn đã có thể làm đc những gì rồi? Bạn xem đoạn code sau có hiểu không?
Mã:
// Giả sử n > 1.
count := 2;
sum := 1 + n;
for i := 2 to trunc(sqrt(n)) do
   if (n mod i = 0) then   // n chia hết cho i nên i là ước của n.
      begin
         count := count + 1;   // có 1 ước nữa là i nên tăng biến đếm.
         sum := sum + i;   // cộng ước mới vào cho tổng.
         if (n div i <> i) then   // nếu i là ước thì n / i cũng là ước nếu n <> i^2
            begin
               count := count + 1;
               sum := sum + n div i;
            end;
      end;
writeln(count, ' ', sum);
 
Sửa lần cuối:
bạn ơi cho mình hỏi chút,ở bài 2.nếu số lớn ta cung phải dùng mảng để lưu trữ như bài trừ ở post trước rồi sau đó sẽ xử lý giống ý của bạn phải không ak
 

tengiday

Happy life
bạn ơi cho mình hỏi chút,ở bài 2.nếu số lớn ta cung phải dùng mảng để lưu trữ như bài trừ ở post trước rồi sau đó sẽ xử lý giống ý của bạn phải không ak
Đúng rồi, bạn lưu số lớn trong mảng y như trước. Để tính N mod 9 thì bạn làm như kiểu mình ghi ở post #2, đừng làm division gì cả. Chỉ còn 1 chi tiết nhỏ nữa là nếu kết quả bằng 0 thì phải chuyển nó thành 9 (i.e số đẹp). Mình quên ghi, lúc khởi tạo phải là result = 0.
 
bạn nói rõ hơn cho mình kể quả =0 thì chuyển thành 9 dk ko
ahàm f(n) là tổng các chữ số của n thì f(n) tính được đó làm sao biết được là số đẹp hay ko hở bạn
và mảng trên lưu ngược hoặc xuôi đều dược phải ko bạn
 

tengiday

Happy life
bạn nói rõ hơn cho mình kể quả =0 thì chuyển thành 9 dk ko ak
và cái này nữa mảng của mình chak ko cần phải luu ngược lại giống post trước phải ko bạn?
Câu hỏi của bạn rất hay: tổng các chữ số của abcd = tổng các chữ số của dcba phải không bạn :) Bạn thử đoạn code sau:
Mã:
a[1] := 6; a[2] := 3; a[3] := 7; a[4] := 5;
n := 4;
result := 0;
for i := 1 to n do   // bạn đổi thành "n downto 1" xem thử nhé
    result := (10 * result + a[i]) mod 9;
if (result = 0) then result := 9;   // dòng lệnh này có thể bỏ qua nếu cần kiểm tra số đẹp, chứ ko phải tìm digital sum.
writeln(result);
Tổng (liên tục) các chữ số của 1 số luôn lớn hơn 0 nếu số đó khác 0. Khi một số mod 9 thì chỉ có thể từ 0 tới 8, nên kết quả 0 là thay thế cho số 9. Bạn làm ví dụ tay sẽ thấy điều này.

PS: Điều thú vị bạn có lẽ nhận ra là: abcd mod 9 = dcba mod 9, cho dù a hay d là số 0. :)

hàm f(n) là tổng các chữ số của n thì f(n) tính được đó làm sao biết được là số đẹp hay ko hở bạn.
Thật ra, chúng ta tính f(f(f(...f(n)...))) đó.
 
voi bài này mình cũng đang hiểu hết sức là mơ hồ
1. về cách lưu trữ: ở đây ta phải dùng xâu tách từng chữ số lưu vào mảng mới được
2. số đẹp ở đây có ngĩa là tổng các chữ số của n phải = 9 hay sao hở bạn( mình chỉ chưa hiểu định nghĩa f(N) là tổng các chữ số của N thì f(N) cũng là số đẹp ) còn cách tính của bạn thì mình đã hiểu
 

tengiday

Happy life
voi bài này mình cũng đang hiểu hết sức là mơ hồ
1. về cách lưu trữ: ở đây ta phải dùng xâu tách từng chữ số lưu vào mảng mới được
2. số đẹp ở đây có ngĩa là tổng các chữ số của n phải = 9 hay sao hở bạn( mình chỉ chưa hiểu định nghĩa f(N) là tổng các chữ số của N thì f(N) cũng là số đẹp ) còn cách tính của bạn thì mình đã hiểu
1) Mình chỉ cần chữ số, không có tính toán như cộng trừ, nên không cần dùng mảng shortint hay integer, dùng trực tiếp string luôn cũng được. Thay vì a thì giờ dùng ord(a) - 48.
2) Đó là định nghĩa kiểu truy hồi, hay dạng đệ quy.
Mã:
N là số đẹp nếu:
- N = 9, hoặc
- f(N) là số đẹp.

f(N) là số đẹp nếu:
- f(N) = 9, hoặc
- f(f(N)) là số đẹp.

f(f(N)) là số đẹp nếu:
- f(f(N)) = 9, hoặc
- f(f(f(N))) là số đẹp.
...
 

Thống kê

Chủ đề
100,657
Bài viết
467,424
Thành viên
339,831
Thành viên mới nhất
TuanShinhanbank
Top