HomeHọc sinh giỏi môn tin

Đề luyện thi HSG tin học lớp 9 – Pascal – Đề số 4

Like Tweet Pin it Share Share Email
Like và share giúp mình phát triển website nhé.
  •  
  •  

Đề luyện thi HSG tin học lớp 9 – Pascal – Đề số 4

Câu 1: TÍNH TỔNG

Viết chương trình tính tổng sau: S = 12 + 22 + … + n2

Dữ liệu vào file: TONG.INP chứa số n (n <=108)

Dữ liệu ra file: TONG.OUT chứa kết quả

Bài làm của Minh

PROGRAM Tinh_tong;
VAR s,tong:STRING;
    n:LONGINT;
    f:TEXT;
    i:BYTE;
FUNCTION NHAN(s:STRING):STRING;
{multiply two large numbers}
VAR L,i,j,code,n1,n2:BYTE;
    c:ARRAY[1..1000] OF WORD;
    tg:STRING[2];
BEGIN
  L:=length(s);
  FOR i:=1 TO L+L DO c[i]:=0;
  FOR i:=1 TO L DO
    FOR j:=1 TO L DO
        BEGIN
          val(s[i],n1,code);
          val(s[j],n2,code);  
          c[i+j]:=c[i+j]+n1*n2;  
        END;                   
  FOR i:=L+L DOWNTO 3 DO
    BEGIN
      c[i-1]:=c[i-1]+ c[i] DIV 10;
      c[i]:=c[i] MOD 10;  
    END;                
  NHAN:='';
  FOR i:=2 TO L+L DO
    BEGIN
      str(c[i],tg);
      NHAN:=NHAN+tg;  
    END;
END;
FUNCTION CONG(s1,s2:STRING):STRING;
{plus two large numbers}
VAR max,i,a,b,nho,code,tam:BYTE;
    tg:STRING[1];
BEGIN
  IF length(s1)>length(s2) THEN max:=length(s1)
  ELSE max:=length(s2);
  WHILE length(s1)<max DO s1:='0'+s1;
  WHILE length(s2)<max DO s2:='0'+s2;
  CONG:=''; nho:=0;
  FOR i:=max DOWNTO 1 DO
    BEGIN
      val(s1[i],a,code);
      val(s2[i],b,code);
      tam:=a+b+nho;
      IF tam>=10 THEN nho:=1 ELSE nho:=0;
      str(tam MOD 10, tg);
      CONG:=tg+CONG;  
    END;            
  IF nho=1 THEN CONG:='1'+CONG;
END;
BEGIN
  assign(f,'TONG_INP.txt');
  reset(f);
  read(f,n);
  close(f);
  assign(f,'TONG_OUT.txt');
  rewrite(f);
  {limit the maximum value of n}
  IF n>100000000 THEN
    BEGIN
      write(f,'n is too large');
      close(f);
      exit;  
    END;
  {limit the minimum value of n}
  IF n<1 THEN
    BEGIN
      write(f,'n should not be less than 1');
      close(f);
      exit;  
    END;
  s:=''; tong:='';
  FOR i:=1 TO n DO
    BEGIN
      str(i,s);
      tong:=CONG(NHAN(s),tong);
    END;
  write(f,tong);
  close(f);  
END.

Câu 2: TAM GIÁC PASCAL

Tam giác Pascal được tạo ra theo qui luật sau:

+ Mỗi dòng đều bắt đầu và kết thúc bởi số 1.

+ Phần tử thứ j ở dòng k nhận được bằng cách cộng 2 phần tử thứ j-1 và j ở dòng thứ k-1.

Viết chương trình in ra màn hình tam giác Pascal. Ví dụ, với n=4 sẽ in ra hình sau:

1

1          1

1          2          1

1          3          3          1

1          4          6          4          1

PROGRAM Tam_giac_pascal;
USES crt;
VAR tg:ARRAY[1..100,1..100] OF WORD;      
    n,i,j,so:BYTE;
BEGIN
  clrscr;
  write('Nhap so n = '); readln(n);
  so:=0;
  FOR i:=1 TO n DO
   BEGIN;    
     so:=so+1;
     FOR j:=1 TO n DO
        IF (j=1) OR (j=so) THEN tg[i,j]:=1
        ELSE tg[i,j]:=tg[i,j-1]+tg[i-1,j];
   END;                                 
  so:=0;
  FOR i:=1 TO n DO
    BEGIN
      so:=so+1;  
      FOR j:=1 TO so DO write(tg[i,j]:5);
      writeln 
    END;            
  readln
END.

Câu 3: MÃ HÓA

Viết chương trình mã hóa Xâu VD mã hóa như sau: ‘AAAABBBCDDDDDDDEEF’ mã hóa thành ‘4A3BC7D2EF’

Dữ liệu vào file: MAHOA.INP chứa xâu cần mã hóa

Dữ liệu ra file: MAHOA.OUT chứa kết quả

PROGRAM ma_hoa;
VAR f:TEXT;
    s,st:STRING;
    i,j,n:BYTE; 
    ok:BOOLEAN;
    tg:STRING[3];
BEGIN
  assign(f,'MAHOA_INP.txt');
  reset(f);
  read(f,s);
  close(f);
  assign(f,'MAHOA_OUT.txt');
  rewrite(f);
  st:=''; ok:=TRUE; i:=1;
  WHILE ok DO
    BEGIN
      n:=1; j:=i+1;
      WHILE (s[j]=s[i]) DO
        BEGIN
          n:=n+1;
          j:=j+1;  
        END;
      IF n>1 THEN str(n,tg)
      ELSE tg:='';
      st:=st+tg+s[i];
      i:=n+i;
      IF i>length(s) THEN ok:=FALSE;
    END;                 
  write(f,st);
  close(f);  
END.

Câu 4: CỘNG HAI SỐ

Viết chương trình cộng hai số tự nhiên a và b (a, b dài tối đa 250 kí tự)

Dữ liệu vào file: SUM.INP hai dòng mỗi dòng chứa một số

Dữ liệu ra file: SUM.OUT một dòng chứa kết quả

PROGRAM sum;
VAR s1,s2,s:STRING;
    i,max,n,n1,n2,nho,code:BYTE;
    tg:STRING[1];
    f:TEXT;
BEGIN
  assign(f,'SUM_INP.txt');
  reset(f);
  readln(f,s1);
  read(f,s2);
  close(f);
  assign(f,'SUM_OUT.txt');
  rewrite(f);
  IF length(s1)>length(s2) THEN max:=length(s1)
  ELSE max:=length(s2);
  WHILE length(s1)<max DO s1:='0'+s1;
  WHILE length(s2)<max DO s2:='0'+s2;
  s:=''; nho:=0;
  FOR i:=max DOWNTO 1 DO
    BEGIN
      val(s1[i],n1,code);
      val(s2[i],n2,code);
      n:=n1+n2+nho;
      IF n>=10 THEN nho:=1 ELSE nho:=0;
      str(n MOD 10, tg);
      s:=tg+s;  
    END;      
  IF nho=1 THEN s:='1'+s;
  write(f,s);
  close(f);  
END.

 

Comments (0)

Trả lời

Your email address will not be published. Required fields are marked *