Ma phuong bac chan

Một phần của tài liệu SUY NGẪM (Trang 29 - 31)

Bài 8.4 Ma phương

Ma phuong bac chan

Ma phuong bac chan ---*) procedure MPC;

var i,j: word; begin

if n=2 then exit; InitMPC;

{Dien so theo xau mau} for i := 1 to k do begin XuLyDong(i); QuayXauMau; end; end;

Sau khi đó tạo xong ma phương ta cần kiểm tra lại xem ma trận M cú thoả cỏc tớnh chất cơ bản của ma phương bậc n cho trước hay khụng.

Thủ tục Test sẽ hiển thị ma phương trờn màn hỡnh và đồng thời kiểm tra xem cỏc tổng cỏc phần tử trờn mỗi dũng, tổng cỏc phần tử trờn mỗi cột, tổng cỏc phần tử trờn đường chộo chớnh c1 và tổng cỏc phần tử trờn đường chộo phụ c2 cú bằng đặc số của ma phương hay khụng.

Ta sử dụng hai mảng dong[1..n], cot[1..n] và hai biến đơn c1, c2 để tớnh cỏc tổng này bằng một lần duyệt mảng hai chiều M.

Để tớnh đặc số ta lưu ý kiểu của biến chứa đặc số d là longint trong khi đú cỏc trị của mảng M là word. Trong Turbo Pascal cú nguyờn tắc sau:

Nguyờn tắc định kiểu cho biểu thức

Kiểu của trị của biểu thức số sẽ là kiểu rộng nhất trong số cỏc kiểu của cỏc đại lượng (hằng và biến) cú mặt trong biểu thức.

Theo quy định này, với khai bỏo n là biến kiểu word thỡ kiểu của trị của biểu thức tớnh đặc số của ma phương bậc n

((n*n+1)*n) div 2

cũng sẽ là word.

Điều này cú thể dẫn đến tràn số.

Ta khắc phục bằng thao tỏc hai bước như sau:

d := 0;

d := d+((n*n+1)*n) div 2;

Khi đú, do biểu thức vế phải của phộp gỏn cú chứa biến d thuộc kiểu longint

nờn kết quả sẽ cú kiểu longint.

Bạn cũng cú thể dựng toỏn tử chuyển sang kiểu longint một trong cỏc đại lượng trong biểu thức vế phải, chẳng hạn:

d := ((n*n+longint(1))*n) div 2 (*--- (*---

Hien thi va kiem tra ket qua ---*) procedure Test;

dong, cot: ML1; d,c1,c2: longint; begin {Tinh Dac so}

d := 0;

d := d+((n*n+1)*n) div 2;

writeln(NL,' Ma phuong bac ',n,', Dac so: ',d); fillchar(dong,sizeof(dong),0); fillchar(cot,sizeof(cot),0); c1 := 0; c2 := 0; for i := 1 to n do begin writeln; c1 := c1 + M[i,i]; c2 := c2 + M[i,n-i+1]; for j := 1 to n do begin write(M[i,j]:4);

dong[i] := dong[i] + M[i,j]; cot[j] := cot[j] + M[i,j]; end; end; writeln; for i := 1 to n do begin if dong[i] <> d then

writeln(' Sai dong ',i,BL,dong[i]); if cot[i] <> d then

writeln(' Sai cot ',i,BL, cot[i]); end;

if c1 <> d then writeln(' Sai cheo chinh ',c1); if c2 <> d then writeln(' Sai cheo phu ',c2); end;

(* Pascal *) (adsbygoogle = window.adsbygoogle || []).push({});

Chương trỡnh MAPHUONG.PAS dưới đõy tạo bộ dữ liệu kiểm thử với cỏc ma phương từ bậc 1 đến bậc 20.

(* MAPHUONG.PAS *) uses crt; uses crt;

const MN = 50;

TT = 'T'; {doi xung Tam} DD = 'D'; {doi xung Doc} NN = 'N'; {doi xung Ngang} BB = 'B'; {Bo qua}

BL = #32; {dau cach}

NL = #13#10; {qua dong moi} type

MW1 = array[0..MN] of word; MW2 = array[0..MN] of MW1; ML1 = array[0..MN] of longint; var M: MW2;

n,k: word; s: string;

Một phần của tài liệu SUY NGẪM (Trang 29 - 31)