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
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 |
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ì.
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.
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Đó 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 ý
DeleteBạ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Đây là bài tập cơ bản, đề cho n<=100.
DeleteMà 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