tài liệu ôn HSG môn tin học

18 263 0
tài liệu ôn HSG môn tin học

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Các tốn có liệu vào lớn, thường gây cho ta nhiều khó khăn Để giải tốn thìcần phải tìm cấu trúc liệu giải thuật thật hợp lý Đa số tốn dạng phải vừa đọc vừa xử lý Lấy ví dụ tốn đơn giản sau: Tìm dòng đặc biệt Cho tệp văn có ndòng (n ≤ 100000) dòng có độ dài khơng q 255 ký tự Trong có dòng xuất lần nhất, dòng lại có số lần xuất số chẵn Bạn lập trình để dòng đặc biệt Dữ liệu vào: tệp dacbiet.inp - Ghi cácdòng thơng tin kết thúc tệp dòng có ký tự ### Dữ liệu ra: tệp dacbiet.out - Ghi radòng đặc biệt tìm Ex: Giải: Với liệuvào lớn n ≤ 10000 giải thuật đơn giản đọc dòng bất kỳsau so sánh với dòng tiếp, khơng thấy xuất hiê.n q lần nóchính dòng đặc biệt, ngược lại thực với dòng Nhưng nếudòng đặc biệtt dòng cuối số lần đọc tệp nhiều nên thờigian chạy chương trình lâu Mặt khác ta lưu trữ vào mảngđượcc nên ta phải vừa đọc, vừa xử lý Thuật toán: sử dụngphép XOR Như ta biết: Dựa vào tính: Nếu A xor B với số lần thực số chẵnthì cho ta A nên ta có thuật toán để giải sau: - Dùng mộtmảng a[1 255] of byte để lưu mã ASCII ký tự dòng đặc biệt - Đọc dòngS vào gán a[i]:=a[i] xorord(s[i]) (i chạy từ đến length(s)) - Viết dòngđặc biệt Chương trình: Program dong_dac_biet; Const fi = 'dacbiet.inp'; fo = 'dacbiet.out'; maxn = 255; Var a : array[1 maxn] of byte; i : integer; s : String; f : Text; Procedure Init; Begin Fillchar(a,sizeof(a),0); Assign(f,fi); Reset(f); End; Procedure Main; Begin While not eof(f) begin Readln(f,s); If s='###' then exit; For i:=1 to length(s) a[i]:=a[i] xorord(s[i]); end; End; Procedure Done; Begin Close(f); Assign(f,fo); Rewrite(f); For i:=1 to maxn if a[i]0 then write(f,chr(a[i])); Close(f); End; BEGIN Init; Main; Done; END Thuật toán độ phức tạpchỉ có N nên chương trình chạy nhanh Ngồi có thuậttốn nữa, không sử dụng phép xornhưng phải dùng mảng chiều kích thước 255*255 Bạn đọc muốn có chương trìnhnày xin liên hệ với soạn với tác giả Chương trình nhập tính tổng hai số siêu lớn ngôn ngữ Pascal Uses Crt; Const NumMax=512; Type Numbers=Array[0 NumMax] Of Byte; Var So1,So2,Tong:Numbers; Procedure Input(Var A:Numbers); Var i,j,Code:Integer; Num: Char; NTmp:Array[0 NumMax*2] Of Byte; Begin Writeln('Nhap vao so that lon'); i:=0; FillChar(A,SizeOf(a),0); Repeat Num:=Readkey; If Num in ['0' '9'] Then Begin Write(Num); Val(Num,NTmp[i],Code); I:=i+1; End; Until Ord(Num)=13; i:=i-1;j:=NumMax; While i>=0 Begin A[j]:=NTmp[i]+(NTmp[i-1] shl 4); i:=i-2; j:=j-1; End; Writeln; End; Procedure WriteNumber(A:Numbers); Var i,j:Integer; HN,LN:Byte; Begin i:=0; While (i Chứng minh khẳng định sau: Mọi số tự nhiên N biểu diễn dạng tổng số số dãy số Fibonaci N = akFk + ak-1Fk-1 + a1F1 Với biểu diễn ta nói N có biểu diễn Fibonaci a kak-1 a2a1 Cho trước số tự nhiên N, tìm biểu diễn Fibonaci số N Input: Tệp văn P11.INP bao gồm nhiều dòng Mỗi dòng ghi số tự nhiên Output: Tệp P11.OUT ghi kết chương trình: dòng ghi lại biểu diễn Fibonaci số tự nhiên tương ứng tệp P11.INP {$R+} const Inp = 'P11.INP'; Out = 'P11.OUT'; Ind = 46; var n: LongInt; Fibo: array[1 Ind] of LongInt; procedure Init; var i: Integer; begin Fibo[1] := 1; Fibo[2] := 1; for i := to Ind Fibo[i] := Fibo[i - 1] + Fibo[i - 2]; end; procedure Solution; var i: LongInt; hfi, hfo: Text; begin Assign(hfi, Inp); Reset(hfi); Assign(hfo, Out); Rewrite(hfo); while not Eof(hfi) begin Readln(hfi, n); Write(hfo, n, ' = '); i := Ind; while Fibo[i] > n Dec(i); Write(hfo, Fibo[i]); Dec(n, Fibo[i]); while n > begin Dec(i); if n >= Fibo[i] then begin Write(hfo, ' + ', Fibo[i]); Dec(n, Fibo[i]); end; end; Writeln(hfo); end; Close(hfo); Close(hfi); end; begin Init; Solution; end Phần tử yên ngựa Cho bảng A kích thước MxN Phần tử Aij gọi phần tử yên ngựa phần tử nhỏ hàng đồng thời phần tử lớn cột Ví dụ bảng số sau đây: 15 55 76 phần tử A22 phần tử yên ngựa Bạn lập chương trình nhập từ bàn phím bảng số kích thước MxN kiểm tra xem có phần tử yên ngựa hay không? const Inp = 'Bai30.INP'; Out = 'Bai30.OUT'; MaxLongInt = 2147483647; var Min, Max: array[1 5000] of LongInt; m, n: Integer; procedure ReadInput; var i, j, k: Integer; hf: Text; begin Assign(hf, Inp); Reset(hf); Readln(hf, m, n); for i := to m Min[i] := MaxLongInt; for j := to n Max[j] := -MaxLongInt; for i := to m begin for j := to n begin Read(hf, k); if Min[i] > k then Min[i] := k; if Max[j] < k then Max[j] := k; end; Readln(hf); end; Close(hf); end; procedure WriteOutput; var i, j: Integer; Result: Boolean; hf: Text; begin Result := False; Assign(hf, Out); Rewrite(hf); Writeln(hf, 'Cac phan tu yen ngua la: '); for i := to m for j := to n if Min[i] = Max[j] then begin Result := True; Write(hf, '(', i, ',', j, '); '); end; if not Result then begin Rewrite(hf); Write(hf, 'Khong co phan tu yen ngua'); end; Close(hf); end; begin ReadInput; WriteOutput; end - Số siêu nguyên tố Số siêu nguyên tố số nguyên tố mà bỏ số tuỳ ý chữ số bên phải phần lại tạo thành số nguyên tố Ví dụ 7331 số siêu ngun tố có chữ số 733, 73, số nguyên tố Nhiệm vụ bạn viết chương trình nhập liệu vào số nguyên N (0< N

Ngày đăng: 31/01/2018, 14:38

Từ khóa liên quan

Mục lục

  • 5. Phần tử yên ngựa

  • 6 - Số siêu nguyên tố

  • 7. Xác định các tứ giác đồng hồ trong ma trận

  • (Dành cho học sinh THCS và THPT)

  • 8. - Hai hàng số kỳ ảo

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan