Giải bài tập Turbo Pascal - Bài 6 trang 79

Viết chương trình nhập từ bàn phím một số nguyên dương n(n<=100) và dãy a gồm n số nguyên a1, a2,..., an có trị tuyệt đối không lớn hơn 1000. Hãy đưa ra những thông tin sau:
a) Số lượng số chẵn và số lẻ trong dãy
b) Số lượng số nguyên tố trong dãy

Giải bài tập Turbo Pascal - Bài 6 trang 79
Giải bài tập Turbo Pascal - Bài 6 trang 79

TEST

Input: a[1]=1; a[2]=2; a[3]=3; a[4]=4; a[5]=5;
Output:
Trong day so co 2 so chan
Trong day so co 3 so le
Trong day so co 3 so nguyen to

Ý tưởng

1. Chúng ta sẽ lưu các phần tử của dãy số vào một mảng
2. Chúng ta dùng vòng lặp for do để duyệt hết các phần tử của mảng và kiểm tra tính chẵn lẻ và nguyên tố của phần tử duyệt qua.
Để kiểm tra tính chẵn lẻ ta sẽ chia phần tử đó cho 2 và lấy phần dư (a[i] mod 2) nếu kết quả bằng 0 thì a[i] là số chẵn ngược lại nó là số lẻ.
Để kiểm tra tính nguyên tố của một số, ta sẽ chia số đó với từng số nguyên trong khoảng từ 2 cho tới căn bậc hai của chính nó sprt(a[i]), nếu không chia hết bất cứ số nào cho số nào thì nó là số nguyên tố, ngược lại thì không phải.
Ngoài ra bạn cũng có thể dùng vòng lặp while để duyệt qua các phần tử, các phần kiểm tra tính chất của số không thay đổi gì.

Chương trình

{bai 6, trang 79, sgk tin hoc 11 }
PROGRAM KT_DAY_SO;
uses crt;
type arrint = array[1..100] of integer;
var a              : arrint;
    n,i,j,sc,sl,snt: integer;
    check          : boolean;
BEGIN
clrscr;
writeln('Nhap so phan tu cua day so (n<=100)'); readln(n);
for i:= 1 to n do
   begin
      writeln('Nhap phan tu a[',i,']');
      readln(a[i]);
   end;
{Dem so chan, so le va so nguyen to};
for i:= 1 to n do
   begin
      {Dem so chan va so le}
      if (a[i] mod 2 = 0) then sc:=sc+1 else sl:=sl+1;
      {kiem tra tinh nguyen to}
      check:=true;
      if a[i] < 2 then check:= false
      else
      for j:= 2 to trunc(sqrt(a[i])) do
         if (a[i] mod j = 0) then
            begin
               check:=false;
               break;
            end;    {dem so nguyen to}
      if check=true then snt:= snt+1;
   end;
{Viet ra ket qua}
Writeln('Trong day so co ',sc,' so chan');
writeln('Trong day so co ',sl,' so le');
writeln('Trong day so co ',snt,' so nguyen to');
readln;
END.

Comments

  1. sqrt(n) xấp xỉ 1 + n/2 . Với nhiều lần gọi hàm sẽ giảm tốc độ chạy của chương trình. Bạn có thể dễ dàng chứng minh công thức trên để cải thiện đáng kể tốc độ cho nó.

    ReplyDelete
    Replies
    1. Đó chỉ là xấp xỉ thôi mà, muốn chính xác thì phải dùng sqrt(). Dù sao cũng cảm ơn bạn đã góp ý

      Delete
  2. Bạn đang chạy vòng lặp trên số nguyên đấy nhé. KẾT QUẢ ĐỀU NHƯ NHAU, nhưng tốc độ sẽ khác nhau. Bạn cứ cho n = 30.000 và trãi nghiệm.

    ReplyDelete
    Replies
    1. Đây là bài tập cơ bản, đề cho n<=100.
      Mà công thức của bạn có chuẩn không? Mình thử căn 2000 gần bằng 44, trong khi dùng công thức của bạn là 1001

      Delete

Post a Comment



» Vui lòng không spam vì nó sẽ bị xóa ngay sau đó.
» Nếu chèn code hãy mã hóa trước khi chèn vào nhận xét.
» Nếu thủ thuật Blog không áp dụng được thì hãy để lại URL blog để mình tiện kiểm tra.