PDA

View Full Version : Đề thi học sinh giỏi tỉnh BR-VT



huyenvt
05-03-2008, 12:09
Bài 1:(7 điểm)
Nhập vào 1 số tự nhiên N với (0<N<=65535)
a) Hãy cho biết chữ số lớn nhất của số tự nhiên vừa nhập
b) Hãy in đảo ngược số N
VD:
N=6548
Chữ số lớn nhất : 8
Số in ngược là : 8456
Bài 2: (7 điểm)
Nhập vào 1 số tự nhiên N với ( 0<N>= 65535), phân tích số vừa nhập thành các thừa số nguyên tố, nếu số vừa nhập là số nguyên tố thì chỉ thông báo ra màn hình đây là số nguyên tố
VD:
- Nếu số vừa nhập là 300, thì in ra màn hình 300=2.2.3.5.5
- Nếu số vừa nhập là 307 , thì in ra màn hình "307 là số nguyên tố"
Bài 3: (6 điểm)
Tìm tất cả các số nguyên dương x,y,z thõa mãn phương trình : ax+by+cz= n; trong đó a,b,c,n là các số nguyên dương (a,b,c <= 65535; n<= 2.147.483.647)
Yêu cầu kĩ thuật:
1. Kiểm tra việc nhập dữ liệu thõa mãn yêu cầu của đề bài . Nếu người sử dụng nhập sai thì thông báo nhập sai và hỏi người dùng có muốn nhập lại hay không, nếu không thì kết thúc chương trình
2. Không được dùng quá 2 vòng lặp lồng nhau và điều kiện dừng của mỗi vòng lặp không được vượt quá ngưỡng mà từ đó ta biết chắc chắn phương trình không có nghiệm
3. Nếu phương trình có nghiệm thì liệt kê có thứ tự các bộ nghiệm của phương trình theo dạng sau
Giả sử phương trình có dạng 15x+28y+24z=454 , ta in ra màn hình như sau:
STT x y z
1 10 10 1
2 14 7 2
Ngược lại không thì thông báo phương trình không có nghiệm

cashier
05-03-2008, 15:09
Nhìn chung đề này có lẽ rắc rối ở phần nhập dữ liệu :D và chắc là bắt lỗi chủ yếu ở phần này :)

Theo ngu ý của mình thì:
B1: đọc từng số vào mảng kí tự, xử lí khi đọc và xuất theo chiều ngược lại

B2: Trong 4rum có rất topic nói về bài này rồi thì phải :)

B3: Sao lại ra cái đề bài rồi bắt ng ta ko dc giải theo cách này hay cách kia <-- rất ghét kiểu đề bài này :)


Không được dùng quá 2 vòng lặp lồng nhau và điều kiện dừng của mỗi vòng lặp không được vượt quá ngưỡng mà từ đó ta biết chắc chắn phương trình không có nghiệm --> ra luôn đầu bài khác cho lành, cứ bắt buộc phải bài này mới dc sao :-?? . Nếu theo đầu bài ràng buộc có lẽ cho thi toán thì hơn, rõ ràng là phi tin học :( , cái này người làm là chính
chứ liên quan j đến tin :( . Tuy nhiên cái phận làm thí sinh thì có bao giờ dc kêu ca đâu, ng ta bắt làm thế nào thì vẫn cứ phải làm thế thôi :


Không được dùng quá 2 vòng lặp lồng nhau
==> dùng 2 vòng lặp vẫn "hợp lệ" ( 1 vòng tìm thử x, 1 vòng tìm thử y ==> z)

điều kiện dừng của mỗi vòng lặp không được vượt quá ngưỡng mà từ đó ta biết chắc chắn phương trình không có nghiệm
==> ngẫm mãi chẳng ra :)) <-- dạo này ngu toán quá T__T

Ai ngẫm ra rồi thì xin dc chỉ giáo :)

trankientrung
05-03-2008, 15:17
Mình thì chỉ biết làm 2 bài là bài 1 và bài 2 còn bài 3 thì chưa nghĩ ra :D

okmen910
05-03-2008, 16:27
bài 3 có lẽ là cho for i và for j chạy 1->n, vòng i là của nghiệm x còn j là của nghiệm y -> kiểm tra nếu (n-ax-by) mà chia hết cho c thì tăng dem rồi xuất dem và x,y,(n-ax-by) div c. Làm xong, nếu dem=0 thì phương trình vô nghiệm
<<không biết Đ hay S^_^>>

m2mpro
05-03-2008, 17:54
Thực chất thì cái chạy cho đến không giới hạn là bẫy, ta hay dùg for cho những bài toán cỡ này :D Vậy nếu dùng while thì sao, đều kiện để vòng lặp chạy là While ax+by+cz<>n do
Còn cái chuyện khhông cho 2 vòg lặp thì để z chạy trong vòng lặp thứ hai :D

tin.truc22
05-03-2008, 18:48
Bài 2 không cho xài 2 vòng lặp chồng lên nhau thì còn biết chứ vượt ngưỡng biết chắc không có nghiệm cũng thua. Vào đấy chắc đọc đề 150 phút ngồi code 30 phút quá.
Mà vét cạn tìm ra tất cả bộ nghiệm hả. Còn cách nào hay hơn 3 vòng lặp chạy không. Đúng thật ngu người bài này. Thua

trankientrung
05-03-2008, 20:01
Câu 3 mình đọc phần Yêu cầu kĩ thuật : cái dòng điều kiện dừng của mỗi vòng lặp không được vượt quá ngưỡng mà từ đó ta biết chắc chắn phương trình không có nghiệm mình không hiểu cho lắm!Có ai giải thích dùm mình không? :D

phuclun
05-03-2008, 20:33
Bài 1 có trong sách của Quách Tuấn Ngọc,ai chăm đọc sách làm đc ngay.:D
Bài 2 ko khác gì bảo tìm những SNT <trunc(sqrt(n)),chỉ có điều xài while do lồng ở ngoài nữa
Bài 3 là baì cho dân chuyên Toán,làm đc ko chứng minh mình giỏi Tin,ko làm đc cũng chẳng chứng minh mình dở Tin.Vì vậy đừng lo về bài 3{có 6 điểm chứ mấy,mà tui nghĩ cũng chẳng mấy ai làm đc đâu},thời gian 90p{theo tui nhớ là vậy} mà làm cả 3 bài này thì thật là... căng đấy.

cashier
05-03-2008, 20:37
điều kiện dừng của mỗi vòng lặp không được vượt quá ngưỡng mà từ đó ta biết chắc chắn phương trình không có nghiệm

Theo ngu ý của mình ( mà cũng có lẽ là của người ra đề :) ) thì nói vậy để đề phòng trường hợp mình for i:=1 to 2 000 000 000 ( vét cạn đó )
Còn trường hợp mà bạn okmen nói có lẽ không đúng như "yêu cầu kĩ thuật" của đề vì nếu cho x chạy tới n, y chạy tới n thì có vẻ "từ đó ta biết chắc chắn phương trình không có nghiệm "
Và cách của m2m thì điều kiện dừng của vòng lặp là : ax+by+cz = n
==> chỉ có thể tìm được 1 bộ nghiệm thôi mà :(

==>Vẫn giữ quan điểm đầu tiên: Một bài toán phi tin học !

tin.truc22
05-03-2008, 20:52
Nếu mà câu 3 vậy có lẽ mất hết 6 điểm rồi. Bài 1 và bài 2 làm 10 phút. Có đề hoàn chỉnh không?

mr_invincible
05-03-2008, 22:34
Đọc cái quy định lằng nhằng của bài 3 đã đủ không muốn làm rồi :D
Mà hình như bài 2 viết sai 1 chỗ, theo tôi phải là (0<N<=65535) chứ nếu để cả 2 dấu lớn hơn thì chắc chỉ cần (N>=65535) thôi chứ :D

huyenvt
06-03-2008, 07:22
giải cho em xem với
huhu em làm sai cả oài

TrầnLong
06-03-2008, 11:50
Hi, ban Huyền ở phòng 10 àh , mình ở phòng 11 .Về fần bài làm thì mình ko biết làm cứ ghi bậy bạ đúng cái nào thì đúng.Các anh pro Tin Học giải 3 bài giùm tụi em với nhé.

mr_invincible
06-03-2008, 12:00
Bài 3 cứ giải bằng toán rồi viết lại thành chương trình :D

huyenvt
06-03-2008, 14:50
Các anh giải tất cả các bài luôn đi huhuhuhu

okmen910
06-03-2008, 15:24
bài 3 nhiều qui định quá nên cũng bóphép.com luôn

huyenvt
06-03-2008, 15:52
các anh giải tất cả các bài luôn đi

mr_invincible
06-03-2008, 22:11
For x:=1 to (n-b-c) div a do
For y:=1 to (n-a*x-c) div b do
If (n-a*x-b*y) mod c=0 then
{Đưa ra nghiệm là x,y, (n-a*x-b*y) div c}

huyenvt
08-03-2008, 12:46
Bài 1, 2 nữa đi mà năn nỉ đó ai đó ơi kiên trung ơi

okmen910
09-03-2008, 14:42
bai` 1
tam:=n;
a/dùng repeat
-so:=n mod 10;
-if so>max thì max:=so;
-n:=n div 10;
cho đến khi n=0 thì thôi
=> xuất số
b/dùng repeat
-so=tam mod 10;
-write(so);
-tam=tam div 10;
cho đến khi tam=0 thì thôi
bài 2:
repeat
-i:=2
-trong khi n không chia hết cho i và n lớn hơn i thì tăng i
-> xuất i (còn cách trình bày dấu nhân thì tự làm)
-n=n div i
cho đến khi n=0 hoặc n=1
<<có lẽ vậy>>

huyenvt
09-03-2008, 15:35
cám ơn bạn nhiều nha . Hu Hu mình thi rớt rồi

Envil_Vlien
28-10-2008, 19:08
Trời ơi! sắp thi tin rùi các bố đánh đòn tâm lý thế này thì làm sao được!
Cái bài 3 mà gặp tui ý à!
Xin ra ngoài ăn kem về sớm!

xelnaga
30-10-2008, 18:28
đề này bài 1, bài 2 dễ. Bài 3 thì chả hiểu cái quái gì luôn T_T

MMKC_IT
30-10-2008, 22:26
Chán cái đề, ràng buộc nhảm nhí..
Mà có bác nào thi cấp 2,3 mà trên máy không.
BRVT bắt thi trên giấy mà nghiêng về toán học hơn là thuật toán

huysun
31-10-2008, 09:46
không ngờ tỉnh BR-VT vẫn "nhập từ bàn phím,in ra màn hình". làm khó học sinh ra.
bài 1: nhập N là string, so sánh từng kí tự(ko cần đổi ra số)=>số lớn nhất.sau đó for i:=length(N) downto 1 do write(N[i]);

bài 2: (N>1) dùng 1 mảng lưu các số nguyên tố <=N.nếu N trong mảng đó thì thông báo "N là nt",còn ko thì nếu N chia hết cho số a[i] thì in số đó ra và "N:=N div a[i]" cho đến khi N=1.

bài 3:
2 vòng for lồng nhau:
for X:=1 to (N-b-c-1)div a do
for Y:=1 to (N-a*X-c)div b do
if (N - a*X + b*Y)mod c=0 then
write(X:4,Y:4,N - a*X - b*Y)div c:4);

(giả sử Y=Z=1 ->X=Xmax=(N-b-c-1)div a
giả sử với X<=Xmax,Z=1 ->Ymax=(N-a*X-c)div b
với X<=Xmax,Y<=Ymax , chỉ cần kiểm tra xem Z là số nguyên hay ko)

neiht1992
01-11-2008, 18:30
bài 3:
2 vòng for lồng nhau:
for X:=1 to (N-b-c-1)div a do
for Y:=1 to (N-a*X-c)div b do
if (N - a*X + b*Y)mod c=0 then
write(X:4,Y:4,N - a*X - b*Y)div c:4);

(giả sử Y=Z=1 ->X=Xmax=(N-b-c-1)div a
giả sử với X<=Xmax,Z=1 ->Ymax=(N-a*X-c)div b
với X<=Xmax,Y<=Ymax , chỉ cần kiểm tra xem Z là số nguyên hay ko)


BÁc làm thế là không thỏa đk 2 rồi.


Bài 3 là một bài rất "Tin" mấy thằng chuyên toán không làm nổi đâu.

Program bai3;
Uses crt;
Var a,b,c,n:integer;
{------------------------------------------}
Procedure Nhap (Var a,b,c,n:integer);
Begin
Repeat
Clrscr;
Writeln ('Nhap cac he so nguyen duong');
Write ('a = '); Readln(a);
Write ('b = '); Readln(b);
Write ('c = '); Readln(c);
Write ('n = '); Readln(n);
If (a<=0) or (b<=0) or (c<=0) or (n<=0) then
Write('Du lieu vao bi sai. Nhan R de nhap lai ');
Until( not((a<=0) or (b<=0) or (c<=0) or (n<=0)) or not(readkey= 'r'));
End;
{------------------------------------------}
Procedure timnghiem (a,b,c,n:integer);
Var x,y,tt:integer;
co:boolean;
Begin
x:=1;
Writeln(' STT x y z');
tt:=1;
co:=false;
While a*x < n do
Begin
y:=1;
While (b*y + a*x) < n do
begin
IF ((n-a*x-b*y) mod c) = 0 then
Begin
Writeln(tt:5,x:5,y:6,((n-a*x-b*y) div c):7);
inc(tt);
co:=true;
end;
inc(y);
End;
inc(x);
End;
IF not co then Write('Phuong trinh vo nghiem');
End;
{---------------------------------------------}
Begin
Nhap(a,b,c,n);
Timnghiem(a,b,c,n);
Readln;
End.

Các bác xem code em làm thế nào cho ý kiến nhé

xelnaga
02-11-2008, 09:46
2. Không được dùng quá 2 vòng lặp lồng nhau và điều kiện dừng của mỗi vòng lặp không được vượt quá ngưỡng mà từ đó ta biết chắc chắn phương trình không có nghiệm

ai giải thích hộ em câu này nó nói gì cái ^^"

neiht1992
02-11-2008, 10:30
Điều kiện không dùng quá 2 hai vòng lặp thì rõ quá rồi. Còn điều kiện dừng không vượt quá ngưỡng mà ta chắc chắn phương trình vo nghiệm có nghĩa ta phải dùng vòng lặp bất định (while do hoặc repeat untill). Tức là cho x chạy từ 1 đến khi nào x chắc chắn không thể là nghiệm thi dừng (a*x > n ) cho y chạy từ 1 đến khi nào giá trị y cùng với x không thể là nghiệm được thì dừng (a*x + b*y > n)

bld
02-11-2008, 10:54
bài 3 mình nghĩ là như thế này :
việc giải phương trình tìm x , y , z đã được gợi ý ở đầu bài là dùng vét cạn ( thử tất cả cách trường hợp ) vì có nói đến 2 vòng for ,
vì vậy ngưỡng của x là
n div a { để a * x không vượt quá n ( từ đó vô nghiệm )}
cụ thể :


nguongx:= n div a ;
for i:=0 to nguongx do
for j:=0 to (n-a*i) div b do
if a*i + b*j = n then xuất x= i , y= j , z = 0 ;
else
if a*i + b*j <n then
if n - ( a*i + b*j ) mod c =0 then
xuất x=i , y =j , z =n-(a*i+b*j) mod c ;

neiht1992
02-11-2008, 11:02
Thuật toán của bác bld giống y của em mà! Mấy bác thử chạy code hoàng chỉnh của em đi chắc đúng rồi đó.

bld
02-11-2008, 11:12
mình thử rồi ,đúng đó bạn !
à , sửa cái code của bld ở trên chút : mấy cái vòng for phải bắt đầu từ 0 thì mới chính xác !
---
à, theo mình thì chuyên toán hay chuyên tin gì mà giải chả được :)

huysun
02-11-2008, 22:10
BÁc làm thế là không thỏa đk 2 rồi.



dk 2 là cái ko quá 2 vòng for ấy à? tui chỉ dùng 2 vòng thôi mà, và cũng loại bỏ hết các trường hợp thừa rùi mà.

bld
03-11-2008, 08:19
e hèm , bạn neight ơi , bài của bạn mình chạy rồi , có nhiều nghiệm bị sai lắm ...

huysun
03-11-2008, 11:12
bài này chỉ lấy nghiệm nguyên dương, vì vậy cho chạy từ 1 là đúng rùi.

neiht1992
03-11-2008, 13:28
xin lỗi bác Huysun chắc em nhầm.
---------------
Bác bld ơi chỉ chỗ sai cho em với hoặc cho em mấy cái test mà bác chạy ra nghiệm sai cũng được.

laurent
17-11-2008, 16:54
Cho mình hỏi đề này ra cho lớp nào vậy bạn?

pham xuan dieu
14-07-2010, 10:05
những bài ra thi đã khó rồi nà còn bắt người ta không làm theo cách này cách khác thật là rắc rối, nhưng phận thí sinh phải chịu thôi, mình cũng sắp đi thi Hội thi tin học trẻ tỉnh Quảng Nam mà bây giờ kiến thức còn mơ hồ quá, thôi thì học đi thi để cọ sát nâng cao trình độ cũng được nếu may mắn có giải nữa thì vui biết mấy !

mini_bestboy
15-07-2010, 10:33
Ý kiến của mình giống mấy bạn trên thôi. Nhưng cái bài 3 này sao câu 1,2,3 giống như dẫn dắt người ta giải từng bước theo hướng nó vậy ta ? Thế thì chỉ làm được theo 1 cách thôi à, không sáng tạo được tí nào hết !

Ủa mà cho hỏi, đề này thi HSG vòng trường hay tỉnh vậy mấy bác ? Mình không nghỉ đề vòng tỉnh mà thế này đâu ! Nếu đề vòng trường thế này mà hồi đó mình làm thì cũng căng thiệt đó ^^

Mấy bác còn được đi thi là sướng rồi, chỉ tiếc cho những người đã qua tuổi mà chưa đi lần nào T_T (Tui đấy)