Thứ Sáu, 24 tháng 2, 2012

Tính tổng chỉ sổ cột hàng chẵn trong mảng 2 chiều

Lập chương trình nhập mảng 2 chiều m hàng n côt. tính và in ra màn hình tổng các phần tử có chỉ số hàng chẵn, chỉ số cột lẹ M, N được nhập từ bàn phím.


Var a:array[1..100,1..100] of integer;
    i,j,m,n:integer;
Begin
  Write('Nhap so hang va cot');readln(m,n);
  For i:=1 to m do
  For j:=1 to n do
  begin
    write('A[',i,',',j,']=');readln(a[i,j]);
  end;
  i:=2;j:=1;
  While i<=m do
  begin
  While j<=n do
   begin
    write('A[',i',',j,']='a[i,j],'   '); j:=j+2;
   end;
  i:=i+2;
  end;
  Readln;
End.

Đảo ngược mảng 1 chiều

Lập chương trình thực hiện đảo ngược mảng số đó.

Var a:array[1..100] of integer;
    n,i:integer;
Begin
  write('Do dai cua mang can nhap?');readln(n);
  For i:=1 to n do
  begin
    write('Phan tu thu ',i,'=?');readln(a[i])
  end;
  writeln('Mang dao nguoc la :');
  For i:=n downto 1 do write(a[i]:5);
  Readln;
End.

Dãy Tribonacci

Dãy Tribonacci là dãy 1 , 1 , 2 , 3 , 7 , 13 , 24... dãy này được sinh ra bới công thức đệ qui sau :
Tr(1) = 1 , Tr(2) = 1 , Tr(3) = 2 , Tr(k) = Tr(k-1)+Tr(k-2)+Tr(k-3) ... với 3< k <37
Mọi số tự nhiên N đều có thể biểu diễn duy nhất dưới dạng tổng của một số số trong dãy Tribonacci.
VD: 17 = 13 + 4; 30 = 24 + 4 + 2;
Cho trước số tự nhiên N nhập từ bàn phím. Viết chương trình tìm biểu diễn Tribonacci của số N.

Ý tưởng: Xây dựng 1 mảng số Tribonacci từ 1 tới 37 (đến 37 vì theo đề bài ...), rồi duyệt từng phần tử của dãy Tribonacci, nếu n> Tribonacci[i] thì in ra Tribonacci[i] và giảm n tới khi n<0 thì thôi.

Uses crt;
Const
  max=37;
Var
  a:array[1..max] of longint;
  n,i:longint;
BEGIN
  Clrscr;
  a[1]:=1; a[2]:=1; a[3]:=2;
  For i:=4 to max do
    a[i]:=a[i-1]+a[i-2]+a[i-3];
  Write('Nhap so n:'); readln(n);
  i:=max;
  While a[i]>n do i:=i-1;
  Write(n,'=',a[i]);
  n:=n-a[i];
  While n>0 do
    Begin
      i:=i-1;
      If n>=a[i] then
        Begin
          Write('+',a[i]);
          n:=n-a[i];
        End;
    End;
  Readln;
END.

Số hoàn thiện

Một số có tỗng các ước nhỏ hơn nó bằng chính nó dc gọi là số hoàn chỉnh.VD 6 có ước nhỏ hơn nó là 1,2,3. Tổng là 1+2+3=6.Viết chương trình xét xem một số n dược nhập từ bàn phím có phải là số hoàn chỉnh không.
PROGRAM hoanthien;
VAR n:INTEGER;
FUNCTION kiemtra(x:INTEGER):BOOLEAN;
VAR tam,i:INTEGER;
BEGIN
tam:=0; kiemtra:=FALSE;
FOR i:= 1 TO (x DIV 2) DO
IF x MOD i = 0 THEN tam:=tam+i;
IF tam = x THEN kiemtra:=TRUE;
END;
BEGIN
writeln('Nhap so can kiem tra ');
readln(n);
IF kiemtra(n) THEN writeln('So ',n,' la so hoan thien')
ELSE
writeln('So ',n,' khong phai la so hoan thien');
readln;
END.

Đếm số nguyên tổ trong mảng 1 chiều

Trong bài viết trước, Code Pascal đã giới thiệu cách xác định tính nguyên tố của 1 số được nhập vào từ bàn phím. Mở rộng đề bài ra thành đếm số nguyên tố trong dãy số N được nhập vào từ bàn phím cũng không quá khó.

Có rất nhiều cách để giải bài toán này, cách dưới đây tuy không bám sát vào cách làm trong bài viết Kiểm tra số nguyên tổ trong pascal nhưng cũng khá dễ hiểu.

var i,j,n:Integer;
    A:array[1..50] of Integer;
begin
      write('nhap n:');
      readln(n);
      for i:=1 to n do
      begin
            write('nhap a[',i,'] ');
            readln(a[i]);
      end;
      j:=1;
      for i:=1 to n do
            if a[i]>1 then
            begin
                 repeat
                       inc(j);
                 until (a[i] mod j=0);
                 if j>(a[i] div 2) then inc(d);
                 j:=1;
            end;
      write('Co ',d,' so ngto trog day');
      readln;
end.

Kiểm tra số nguyên tổ trong pascal

Nhập vào 1 số. Xác định xem số đó có phải số nguyên tố hay không.

Đây là một bài toán rất căn bản trong Pascal. Ý tưởng: Số nguyên tố là số chia cho 1 và chính nó. Giả sử số vừa nhập vào là n, ta cho i chạy từ 2 đến n-1, nếu n chia hết cho i trong bất cứ lần lặp nào thì có nghĩa là n không nguyên tố, nếu không chia hết cho bất cứ lần lặp nào là nguyên tố. Về nguyên tắc là như vậy, nhưng người ta đã chứng minh được rằng chỉ cần xét từ 1 đến phần nguyên căn 2 của N. Như thế thuật toán sẽ tối ưu hơn.


program kiem_tra_nguyen_to;
uses crt;
var n,i:integer; bl:boolean;
begin
 clrscr;
 bl:=true;
 write('nhap vao so can kiem tra tinh nguyen to: '); readln(n);
 if n<=1 then bl:=false;
 for i:=2 to trunc(sqrt(n)) then
  if n mod i=0 then bl:=false;
 if bl=true then write('so vua nhap nguyen to.')
 else write('so vua nhap khong nguyen to.');
readln;
end.

Bouns: Chứng minh: Chỉ cần xét từ 1 đến phần nguyên căn 2 của N thay vì xét đến N: 
Lấy ví dụ số không nguyên tố:
9=3*3
12=3*4
18=2*9=3*6
20=4*5=2*10
trong các ví dụ trên, các số không nguyên tố được phân tích thành tích các cặp ước của chúng, trong mỗi cặp số nhỏ đứng trước, số lớn đứng sau. Trong mỗi cặp, ta có thể thấy rõ một điều: số đứng trước (nhỏ hơn) luôn luôn nhỏ hơn hoặc bằng căn bậc hai của số cần xét. Ví dụ ta thấy 20=4*5, rõ ràng 4 nhỏ hơn căn bậc hai của 20. Bạn tự xét các ví dụ khác nhé. Có thể chứng minh được điều này bằng toán học như sau:


Chứng minh: Gọi số cần xét là n, căn bậc hai của nó là x, hai ước tương ứng có tích bằng n của nó là a và b(a<>b), ta cần chứng minh a<x hoặc b<x. Vì a và b có vai trò tương đương, nên ta giả sử a<b.
Giả sử a>x và b>x, ta có a*b>x*x=n => trái với giải thiết. Vậy trong hai số a và b, phải có một số nhỏ hơn x. 
Dựa vào đặc điểm trên, ta sẽ giới hạn phạm vi của i là 2->n-1 thành 2->sqrt(n). Tuy nhiên, sqrt(n) với n không chính phương sẽ ra số vô tỉ, trong khi i là số nguyên, vậy cần làm tròn sqrt(n). Phạm vi mới sẽ là 2->trunc(sqrt(n)).

Thứ Năm, 23 tháng 2, 2012

In bảng cửu chương

Lập chương trình Pascal để in bảng cửu chương ra màn hình.

Uses crt;
Var
  a:array[1..9,1..9] of Integer ;
  i,j:byte ;
BEGIN
  Clrscr ;
  For i := 1 to 9 do
    For j := 1 to 9 do
      A[i,j] := i*j ;
  For i := 1 to 9 do
    Begin
      For j := 1 to 9 do Write(a[i,j]:5);
      Writeln ;
      Writeln ;
    End ;
  Readln ;
END.

Bài đăng phổ biến