# GÓC SÁNG TẠO > Khu vực lập trình > Pascal/Delphi/Kylix >  Đề thi tin học trẻ tỉnh Bắc Ninh năm 2009, mới nè!!

## phamhoasp

Bây giờ mình cho các bạn đề thi tin học mình mới thi xong, ai có hứng thú thì làm thử, còn ai không hứng thú thì đọc cho vui.
Bài 1. Các bộ 3 số có tổng là số nguyên tố
Cho số nguyên dương N (3<=N<=10000) và dãy các số nguyên A[1], A[2], A[3], …, A[N] có giá trị tuyệt đối không vượt quá 109 .
Yêu cầu: Hãy tìm và in ra tất cả các bọ 3 số A_, A[j], A[k] sao cho A+ A[j]+ A[k] là một số nguyên tố
Dữ liệu vào: cho trong file văn bản bo3nt.inp có cấu trúc như sau:
+ Dòng 1: ghi số nguyên dương N
+ Dòng 2: ghi N số nguyên A[1], A[2], A[3], …, A[N]
Kết quả: Ghi ra file văn bản bo3nt.out có cấu trúc như sau:
Mỗi dòng ghi một bộ 3 số tìm được có dạng (A, A[j], A[k]) (A
< A[j]< A[k])
V í d ụ:
Bo3nt.inp
Bo3nt.out​5
1 3 5 -2 6
(-2;1;3)
(-2;1;6)
(-2;3;6)


Bài 2: Quy đồng mẫu số
Cho số tự nhiên N và dãy gồm N phân số. Mỗi phân số được biểu diễn dưới dạng một cặp số nguyên (tử, mẫu) trong đó mẫu là số nguyên dương.
Yêu cầu: Đưa ra dãy các phân số đã quy đồng mẫu số.
Dữ liệu vào: cho trong file văn bản qdong.inp có cấu trúc như sau:
+ Dòng 1: ghi số nguyên dương N (2<=N<=10000)
+ Dòng i (2<=i<=N+1) trong số N dòng tiếp theo mỗi dòng ghi 2 số nguyên tử, mẫu ứng là tử số và mẫu số của phân số thứ i.
Kết quả: Ghi ra file văn bản qdong.out có cấu trúc như sau:
Mỗi phân số ghi trên một dong có dạng tử/m ẫu.
V í d ụ:
qdong.inp
qdong.out​3
1 2
3 4
3 5
10/20
15/20
12/20


(Các số ghi trên cùng một dòng của file vào ghi cách nhau ít nhất một dấu cách)
Bài 3. Lấy hàng
Sa mạc được coi như một lưới hình chữ nhật gồm M*N ô vuông. Trên mỗi ô vuông có một số lượng các kiện hàng (các kiên hàng là như nhau) Một robot lấy hàng đi từ ô xác định có toạ độ (1, xp) trên dòng đầu và di chuyển sang ô xác ịnh có toạ độ (m, kt) trên cạnh đối diện của sa mạc, nhưng trong quá trình di chuyển thì nó chỉ có thể đi thẳng về phía trước mặt hoặc chỉ có thể tiến bên trái hoặc bên phải một góc 45o so với hướng di chuyển về cuối dòng như hình dưới đây.

Robot(xp)












kt




dòng đầu Hướng có thể đi của robot

Dòng cuối


(Có nghĩa là nếu robot từ ô (i, j) chỉ có thể di chuyển đến một trong 3 ô có toạ độ (i+1, j-1), (i+1, j), (i+1, j+1) nếu các ô này thuộc sa mạc)
Yêu cầu: Hãy xây dựng cho robot một lộ trình lấy hàng từ ô xuất phát đến ô kết thúc sao cho số hàng lấy được là nhiều nhất. Giả thiết rằng robot có khả năng mang hàng không hạn chế.
Dữ liệu vào: cho trong file văn bản layhang.inp có cấu trúc như sau:
+ Dòng 1: ghi 2 số nguyên dương M, N (2<=N<=1000)
+ Dòng i (2<=i<=M+1) trong số M dòng tiếp theo mỗi dòng ghi N số nguyên A[i, 1], A[i, 2], A[i, 3], …, A[i, N] tương ứng là số kiện hàng trên các ô của dòng i.
+ Dòng cuối ghi bốn số nguyên dương x, y, z, t là toạ độ của ô xuất phát và ô kết thúc.
Kết quả: Ghi ra file văn bản layhang.out có cấu trúc như sau:
+ Dòng 1: ghi số S là tổng số hàng lấy được
+ Dòng 2 ghi lộ trình của robot từ ô xuất phát đến ô kết thúc.
layhang.inp
layhang.out​4 4
1 3 8 2 
9 4 7 9
2 5 7 10
3 1 6 8
1 2 4 3
s=26
(1, 2)--> (2, 3)-->(3, 4)-->(4, 3)


(Các số ghi trên cùng một dòng cách nhau ít nhất một dấu cách)_

----------


## lienqh

Mình đã giải bài 1 nếu khong chạy tệp thì đưa ra màn hình đúng nhưng chạy trong tệp thì bị lỗi File not open for output]Các bạn xem và sửa giúp
Đây là code chương trình


```
Var A,B: array[1..100] of integer;
i,j,k,N,tg,h,g,T,m:integer;
f1,f2:text;
function ngto(N:integer):boolean;
VAr d,i:integer;
Begin
d:=0;
For i:=1 to N do
if ( N mod i=0 ) then inc(d);
if (d=2) then ngto:=true else ngto:=false;
End;
Begin
assign(f1,'BO3NT.INP'); Reset(f1);
assign(f2,'BO3NT.OUT'); Rewrite(f2);
 Write(f1,'N=');
 Readln(f1,N);
For i:=1 to N do
Begin
 Write(f1,'A[',i,']=');
 Readln(f1,A[i]);
End;
For i:=1 to N-2 do
 
For j:=i+1 to N-1 do
 
 For k:=j+1 to N do
 
 
     if ngto(A[i]+A[j]+A[k]) then
     Begin
       Begin
          B[1]:=A[i];
          B[2]:=A[j];
          B[3]:=A[k];
       End;
For h:=1 to 2 do
  For g:=h+1 to 3 do
   if b[h]>b[g] then
     Begin
       tg:=B[h];
       B[h]:=B[g];
       B[g]:=tg;
     End;
     assign(f2,'BO3NT.OUT'); Rewrite(f2);
  writeln(f2,'(',B[1],';',B[2],';',B[3],')');
   end;
 
Readln
End.
```

----------


## hoanggiang212

mình giup bạn câu 2:
program bài;
uses crt; 
var f1,f2: text;
i,j,n: integer;
function ucln(a,b:integer): integer;
begin
while a<>b do

----------


## nhocnguyen_vip

> Mình đã giải bài 1 nếu khong chạy tệp thì đưa ra màn hình đúng nhưng chạy trong tệp thì bị lỗi File not open for output]Các bạn xem và sửa giúp
> Đây là code chương trình
> 
> 
> ```
> Var A,B: array[1..100] of integer;
> i,j,k,N,tg,h,g,T,m:integer;
> f1,f2:text;
> function ngto(N:integer):boolean;
> ...


- coi lại cách đọc file 
- mình đã sửa lại cách đọc file nhưng ct vẫn k đúng . Nhìn rối quá , lại k bik ý tưởng chẳng bik đường nào mà sửa

----------


## hoathachthao

> Bây giờ mình cho các bạn đề thi tin học mình mới thi xong, ai có hứng thú thì làm thử, còn ai không hứng thú thì đọc cho vui.
> Bài 1. Các bộ 3 số có tổng là số nguyên tố
> Cho số nguyên dương N (3<=N<=10000) và dãy các số nguyên A[1], A[2], A[3], …, A[N] có giá trị tuyệt đối không vượt quá 109 .
> Yêu cầu: Hãy tìm và in ra tất cả các bọ 3 số A_, A[j], A[k] sao cho A+ A[j]+ A[k] là một số nguyên tố
> Dữ liệu vào: cho trong file văn bản bo3nt.inp có cấu trúc như sau:
> + Dòng 1: ghi số nguyên dương N
> + Dòng 2: ghi N số nguyên A[1], A[2], A[3], …, A[N]
> Kết quả: Ghi ra file văn bản bo3nt.out có cấu trúc như sau:
> Mỗi dòng ghi một bộ 3 số tìm được có dạng (A, A[j], A[k]) (A
> ...


_


bài 1 : dùng quay lui
bài 2 : tìm bcnn của các mẫu số 
bài 3 : QHĐ hay đồ thị

nghĩ thế thôi , k bik đúng k nữa_

----------


## nguyenbahoang1

*Sửa thêm nhé*

Ở dòng sai của bạn: Do bạn chưa có tệp Bo3Nt nên khi gặp thủ tục Reset(f1) nó sẽ báo lỗi vì đây là thủ tục đọc dữ liệu. mà tệp Bo3Nt của bạn chưa có nếu muốn không sai, bạn hãy tạo sẵn tệp đó với dữ kiện theo đề bài.

----------


## daohoa

@phuninhchien : vs lỗi đó , chạy trên trình fp nó báo lỗi ex 2 , tb báo lỗi "file not found"
@lehang : chưa đóng file nữa =.=!

----------


## wassing123

> Mình đã giải bài 1 nếu khong chạy tệp thì đưa ra màn hình đúng nhưng chạy trong tệp thì bị lỗi File not open for output]Các bạn xem và sửa giúp
> Đây là code chương trình
> 
> 
> ```
> Var A,B: array[1..100] of integer;
> i,j,k,N,tg,h,g,T,m:integer;
> f1,f2:text;
> function ngto(N:integer):boolean;
> ...


------> Chưa chạy thử nhưng nhiều lỗi quá:
1. Đọc dữ liệu từ file thì cần gì những dòng màu đỏ
2. Chương trình này chỉ tìm được 1 bộ nghiệm cuối cùng B[1] B[2] B[3]
3. Chưa đóng tệp
------> Còn vài điều cần bàn:
1. Nên sắp xếp lại dãy ban đầu trước khi xử lý
2. Cách này ko phải là 'quay lui' mà phải gọi là 'ghi đè'

----------


## phimlen1

Bài 1:


```
Program BO3NT;
Const fi  = 'BO3NT.INP';
      fo  = 'BO3NT.OUT';
      Max = 10000;
Var N: Integer;
    A: Array [1..Max] of Integer;
    f: Text;
 
Procedure Enter;
Var i: Integer;
Begin
    Assign(f,fi);  Reset(f);
    Readln(f,N);
    For i:=1 to N do Read(f,A[i]);
    Close(f);
End;
 
Procedure Sort;
Var i, j, t: Integer;
Begin
    For j:=N downto 2 do
        For i:=1 to j-1 do
            If A[i] > A[i+1] then
               Begin
                   t:=A[i];
                   A[i]:=A[i+1];
                   A[i+1]:=t;
               End;
End;
 
Function Snt (N: Integer): Boolean;
Var i: Integer;
Begin
    If N<=1 then Begin Snt:=False; Exit; End;
    Snt:=False;
    For i:=2 to trunc(sqrt(N)) do
        If N mod i = 0 then Exit;
    Snt:=True;
End;
 
Procedure Solution;
Var i, j, k: Integer;
Begin
    Assign(f,fo);  Rewrite(f);
    For i:=1 to N-2 do
        For j:=i+1 to N-1 do
            For k:=j+1 to N do
                If Snt (A[i]+A[j]+A[k]) then
                   Writeln(f,'(',A[i],';',A[j],';',A[k],')');
    Close(f);
End;
 
BEGIN
    Enter;
    Sort;
    Solution;
END.
```

----------


## hatrang1995

Bài 2:


```
Program Quy_Dong;
Const fi  = 'QDONG.INP';
      fo  = 'QDONG.OUT';
      Max = 10000;
Var A: Array [1..Max,1..2] of Integer;
    N: Integer;
    f: Text;
 
Procedure Enter;
Var i: Integer;
Begin
    Assign(f,fi);  Reset(f);
    Readln(f,N);
    For i:=1 to N do Readln(f,A[i,1],A[i,2]);
    Close(f);
End;
 
Function BCNN (x,y: Integer): Integer;
Var UCLN, a, b: Integer;
Begin
    a:=x;  b:=y;
    While a<>b do
          If a>b then a:=a-b Else b:=b-a;
    UCLN:=a;
    BCNN:= x * y div UCLN;
End;
 
Function BCNN2 (i: Integer): Integer;
Begin
    If i=1 then BCNN2:=A[1,2]
    Else BCNN2 := BCNN (BCNN2(i-1),A[i,2]);
End;
 
Procedure Solution;
Var BC, i: Integer;
Begin
    BC:=BCNN2 (N);
    Assign(f,fo);  Rewrite(f);
    For i:=1 to N do Writeln(f,BC div A[i,2] * A[i,1],' ',BC);
    Close(f);
End; 
 
BEGIN
    Enter;
    Solution;
END.
```

----------

