Đội ôn thi tin học trẻ không chuyên năm 2012

Status
Không mở trả lời sau này.
C

cuong276

Thôi thôi. Đừng ngồi đó mà buôn chuyện nữa. Có đề làm nè. Bài này cũng khá dễ.
Xét tập tất cả các phân số tối giản nằm trong đoạn từ 0 đến 1, với mẫu số là số nguyên dương nhỏ hơn hoặc bằng N tử số là các số nguyên không âm.
Ví dụ, với n=5 thì tập này gồm các phân số sau: [TEX]\frac{0}{1} , \frac{1}{5} , \frac{1}{4} , \frac{1}{3} , \frac{2}{5} , \frac{1}{2} , \frac{3}{5} , \frac{2}{3} , \frac{3}{4} , \frac{4}{5} , \frac{1}{1}[/TEX]
Bạn hãy viết 1 CT, cho trước 1 số nguyên N (1 \leq N \leq 100), ghi ra các phân số theo thứ tự tăng dần.
Dữ liệu: File vào gồm 1 dòng chứa đúng 1 số nguyên N.
Kết quả: file ra chứa tất cả các phân số theo thứ tự tăng dần, mỗi phân số ghi trên 1 dòng theo định dạng trong ví dụ dưới đây.
Ví dụ:
frac.inp:
5
frac.out
0/1
1/5
1/4
1/3
2/5
1/2
3/5
2/3
3/4
4/5
1/1
Mọi người làm thử đi nha :D
 
C

cuong276

Có bài này nữa nè. Bài này mình nghĩ ra thuật toán rồi nhưng mãi không ra cách lập trình
Bạn phải viết viết chương trình đưa ra tất cả các từ có thể phát sinh từ 1 tập các chữ cái.
Ví dụ: Cho từ "abc", chương trình của bạn phải đưa ra được các từ "abc,"acb","bac","bca","cab" và "cba" ( bằng cách khảo sát tất cả các trường hợp khác nhau của tổ hợp ba chữ cái đã cho).
Input
Dữ liệu vào được cho trong tệp input.txt chứa 1 số từ. Dòng đầu tiên là 1 số tự nhiên cho biết số từ cho ở dưới. Mỗi dòng tiếp theo chứa 1 từ. Trong đó, 1 từ có thể chứ cả chữ cái thường hoặc hoa từ A đến Z. Các chữ thường và hoa được coi như là khác nhau. Một chữ cái nào đó có thể xuất hiện nhiều hơn 1 lần.
Output
Với mỗi từ đã cho trong file input.txt, kết quả nhận được ra file output.txt phải chứa tất cả các từ khác nhau được sinh ra từ chữ các chữ cái của từ đó. Các từ được sinh ra từ 1 từ đã cho phải được đưa ra theo thứ tự tăng dần của bảng chữ cái.
Ví dụ:
input.txt:
2
abc
acba
output.txt:
abc
acb
bac
bca
cab
cba
aabc
aacb
abac
abca
acab
acba
baac
baca
bcaa
caab
caba
cbaa
 
M

mikelhpdatke

Bài này có nhiều cách giải, dùng thuật toán đảo chỉ số trong sach của Lê Minh Hoàng cũng là 1 cách. HOặc bạn đọc trong sách toán tin của trường đại học Đà Lạt cũng có cách hay. Chờ mình code bài chữ số hôm nọ đã. Tý post thuật toán
 
C

cuong276

Có bài này nữa nè. Bài này mình nghĩ ra thuật toán rồi nhưng mãi không ra cách lập trình
Bạn phải viết viết chương trình đưa ra tất cả các từ có thể phát sinh từ 1 tập các chữ cái.
Ví dụ: Cho từ "abc", chương trình của bạn phải đưa ra được các từ "abc,"acb","bac","bca","cab" và "cba" ( bằng cách khảo sát tất cả các trường hợp khác nhau của tổ hợp ba chữ cái đã cho).
Input
Dữ liệu vào được cho trong tệp input.txt chứa 1 số từ. Dòng đầu tiên là 1 số tự nhiên cho biết số từ cho ở dưới. Mỗi dòng tiếp theo chứa 1 từ. Trong đó, 1 từ có thể chứ cả chữ cái thường hoặc hoa từ A đến Z. Các chữ thường và hoa được coi như là khác nhau. Một chữ cái nào đó có thể xuất hiện nhiều hơn 1 lần.
Output
Với mỗi từ đã cho trong file input.txt, kết quả nhận được ra file output.txt phải chứa tất cả các từ khác nhau được sinh ra từ chữ các chữ cái của từ đó. Các từ được sinh ra từ 1 từ đã cho phải được đưa ra theo thứ tự tăng dần của bảng chữ cái.
Ví dụ:
input.txt:
2
abc
acba
output.txt:
abc
acb
bac
bca
cab
cba
aabc
aacb
abac
abca
acab
acba
baac
baca
bcaa
caab
caba
cbaa
Bài này mình tham khảo nên làm được rồi
Mã:
USES Crt;
CONST
  MAX = 100;
  INP = 'inp.txt';
  OUT = 'out.txt';
TYPE
  STR = array[0..max] of char;
VAR
  s   :str;
  f,g :text;
  n   :longint;  { so luong tu}
  time:longint ;

PROCEDURE Nhap_dl;
Begin
  Assign(f,inp);
  Assign(g,out);
  Reset(f);
  Rewrite(g);
  Readln(f,n);
End;

PROCEDURE DocDay(var s:str);
Begin
    Fillchar(s,sizeof(s),chr(0));
    While not eoln(f) do
      begin
        s[0]:=chr(ord(s[0])+1);
        read(f,s[ord(s[0])]);
      end;
End;

PROCEDURE VietDay(s:str);
Var i   :word;
Begin
  For i:=1 to ord(s[0]) do Write(g,s[i]);
End;

PROCEDURE Sap_xep(l,r:word);
var i,j    :word;
    tg,tam :char;
Begin
  i:=l;j:=r;
  tg:=s[(l+r) div 2];
  Repeat
     While ord(s[i]) < ord(tg) do inc(i);
     While ord(s[j]) > ord(tg) do dec(j);
     If i<=j then
       begin
          tam:=s[i];
          s[i]:=s[j];
          s[j]:=tam;
          inc(i);
          dec(j);
       end;
  Until i>j;
  If j>l then Sap_xep(l,j);
  If i<r then Sap_xep(i,r);
End;

PROCEDURE Sinh_hv(s:str);
Var vti,vtj,i,j:word;
    stop       :boolean;
    tam        :char;
Begin
  Writeln(g);
  VietDay(s);
  Repeat
     Stop:=true;
     For i:= ord(s[0]) downto 2 do
       If s[i] > s[i-1] then
         begin
            vti:=i-1;
            stop:=false;
            For j:=ord(s[0]) downto vti+1 do
              begin
                If (ord(s[j])>ord(s[vti])) then
                  begin
                     vtj:=j;
                     break;
                  end;
              end;
            tam:=s[vtj];
            s[vtj]:=s[vti];
            s[vti]:=tam;
            For j:=1 to ((ord(s[0]) - (vti+1))+1) div 2 do
              begin
                tam:=s[vti+j];
                s[vti+j]:=s[ord(s[0])-j+1];
                s[ord(s[0])-j+1]:=tam;
              end;
            Writeln(g);
            VietDay(s);
            break;
         end;
  Until stop;
End;

PROCEDURE Xu_ly;
Var i:longint;
Begin
  For i:=1 to n do
    begin
        DocDay(s);
        readln(f);
        Sap_xep(1,ord(s[0]));
        Sinh_hv(s);
        Writeln(g);
    end;
  Close(f);
  Close(g);
End;

BEGIN
  Nhap_dl;
  Xu_ly;
END.
 
Last edited by a moderator:
C

cuong276

Ừ! Đúng vậy! Còn bài này làm được chưa?
Thôi thôi. Đừng ngồi đó mà buôn chuyện nữa. Có đề làm nè. Bài này cũng khá dễ.
Xét tập tất cả các phân số tối giản nằm trong đoạn từ 0 đến 1, với mẫu số là số nguyên dương nhỏ hơn hoặc bằng N tử số là các số nguyên không âm.
Ví dụ, với n=5 thì tập này gồm các phân số sau: [TEX]\frac{0}{1} , \frac{1}{5} , \frac{1}{4} , \frac{1}{3} , \frac{2}{5} , \frac{1}{2} , \frac{3}{5} , \frac{2}{3} , \frac{3}{4} , \frac{4}{5} , \frac{1}{1}[/TEX]
Bạn hãy viết 1 CT, cho trước 1 số nguyên N (1 \leq N \leq 100), ghi ra các phân số theo thứ tự tăng dần.
Dữ liệu: File vào gồm 1 dòng chứa đúng 1 số nguyên N.
Kết quả: file ra chứa tất cả các phân số theo thứ tự tăng dần, mỗi phân số ghi trên 1 dòng theo định dạng trong ví dụ dưới đây.
Ví dụ:
frac.inp:
5
frac.out
0/1
1/5
1/4
1/3
2/5
1/2
3/5
2/3
3/4
4/5
1/1
Mọi người làm thử đi nha :D
Mình có cái code này nè. Mọi người xem thử nha.
Mã:
Uses crt;
Type Phanso = (tu, mau);
   Var F: array[1..4000, phanso] of integer;
          N, dem : Integer;
          k,g:text;
Procedure doc;
Begin
  assign(k,'frac.inp');
  reset(k);
  readln(k,N);
  F[1,tu] := 0; F[1,mau] := 1; dem := 2;
  F[dem, tu] := 1; F[dem,mau] := 1;
  close(k);
End;
Procedure Chen(t,m,i:Integer);
  Var j:integer;
Begin
  assign(g,'frac.out');
  rewrite(g);
  Inc(dem);
  For j := dem downto i + 1 do
  begin
       F[j,tu] := F[j-1,tu];
       F[j,mau] := F[j-1,mau];
  end;
  F[i,tu] := t; F[i,mau] := m;
end;
procedure xuli;
  Var t,m,i:integer;
Begin
  for m:=2 to N do
    for t:=1 to m-1 do
    begin
         i:=1;
         While (F[i,tu]*m < F[i,mau]*t) do inc(i);
         If (F[i,tu]*m > F[i,mau]*t) then chen(t,m,i);
    end;
End;
Procedure xuat;
   var i,j,tgts,tgms:integer;
Begin
  for i:=1 to dem do writeln(g,F[i,tu],'/',F[i,mau]);
  close(g);
End;
BEGIN
   doc;
   xuli;
   Xuat;
END.
 
T

thiennu274

Có bài này hay nè, post lên cho mấy anh em làm. Rồi ôn thi luôn :D ( zí lại cái bài này mình cũng đang nhức đầu vì nó, post lên chia sẻ luôn). Không nhớ đề lắm nhaz, ai muốn rõ thêm thì liên hệ

Cho Robot đang ở vị trí trên tọa độ A(x,y)
Tìm điểm đến của một Robot trên A(x,y) theo một chuỗi cho trước, và định theo 1 quy luật sẵn:
Dm: cho robot đi lên theo m
dm: cho robot lùi theo m
Qm: cho robot quay một góc 45 m lần theo chiều kim đồng hồ
qm: cho robot quay một góc 45 m lần ngược chiều kim đồng hồ
Nhập vào một chuỗi theo quy luật, in ra tọa độ A(x,y) mà robot đến


Đại loại cái bài là thế. Rất tiếc mình quên ví dụ. Ráng hiểu nhaz, mấy bạn cũng thông minh mà hé [/COLOR]
 
M

mikelhpdatke

Sau gần 48h cả ăn ngủ lọ mọ cũng làm được bài này. Sai báo lại cho mình nhà

Bài 1 : Tổng các chữ số
Cho số nguyên dương n. VIết các số nguyên liên tiếp từ 1 tới n trong hệ thập phân để tạo ra một dãy các chữ số. Hãy tính tổng các chữ số của dãy.

Ví dụ : với n = 12, ta có dãy chữ số 123456789101112 với tổng là 51.

Test n=
12
123
2468
13579
12481632
23456789
9876543210
123123123123
123456789123456789
98765432100123456789

Mã:
Program Bai_1;
Type mang = array[1..9] Of String;
Var st,s,kq,bx:string;
   k,i,j,N,h,y,u:integer;
   Lap,A,F,C:array[1..21] Of string;

Function Cong(a,b:string):string;
Var s:string;
    t,i:integer;
   Begin
    While (length(a)<length(b)) do a:='0'+a;
    While (length(b)<length(a)) do b:='0'+b;
    s:='';
    t:=0;
     For i:=length(a) downto 1 do
      Begin
       t:=t+ord(a[i])+ord(b[i])-96;
       s:=chr(t mod 10 +48)+s;
       t:=t div 10;
      End;
     If t>0 then s:=chr(t+48)+s;
     cong:=s;
     Exit;
    End;
Function nhan(a:string;b:longint):string;
 Var i,t:integer;
    s:string;
  Begin
   s:='';
   t:=0;
    For i:=length(a) downto 1 do
     Begin
      t:=t+(ord(a[i])-48)*b;
      s:=chr(t mod 10 +48)+s;
      t:=t div 10;
     End;
    If t>0 then s:=chr(t+48)+s;
   While (length(s)>1) and (s[1]='0') do Delete(s,1,1);
   nhan:=s;
   Exit;
  End;


Function tongcs(i:integer):string;
   Var j,x,q,df,l:integer;
       bs,khong,st,p,sum,s1,s2,c,sumcs:string;
       ch:Char;
    Begin
      if s[i]='0' then exit;
      khong:='';
      st:='';
      sumcs:='1';
      c:='1';
      bs:='';
      df:=0;
      Val(s[i],x,q);
     For j:=1 to length(s)-i do khong:=khong+'0';
     For j:=2 to x-1 do
      Begin
       Str(j,s2);
       sumcs:=cong(sumcs,s2);
      End;
     sumcs:=sumcs+khong;
     st:=s[i]+khong;
     sum:=A[length(khong)];
     If s[i]>'1' then
      Begin
      sum:=cong(cong(nhan(sum,x),s[i]),sumcs);
      inc(h);
      F[h]:=sum;
     End Else
      Begin
       inc(h);
       F[h]:=(cong(sum,s[i]));
      End;


End;
Procedure Init;
Var d,j,i,x:integer;
  s1,s2,si:string;
 Begin
 C[1]:='1';
 C[2]:='3';
 C[3]:='6';
 C[4]:='10';
 C[5]:='15';
 C[6]:='21';
 C[7]:='28';
 C[8]:='36';
 C[9]:='45';
 A[1]:='45';
 A[2]:='900';
 A[3]:='13500';
 A[4]:='180000';
 A[5]:='2250000';
 A[6]:='27000000';
 A[7]:='315000000';
 A[8]:='3600000000';
 A[9]:='40500000000';
A[10]:='450000000000';
A[11]:='4950000000000';
A[12]:='54000000000000';
A[13]:='585000000000000';
A[14]:='6300000000000000';
A[15]:='67500000000000000';
A[16]:='720000000000000000';
A[17]:='7650000000000000000';
A[18]:='81000000000000000000';
A[19]:='855000000000000000000';
A[20]:='9000000000000000000000';


k:=0;
Write('Nhap N:');Readln(s);
 For i:=1 to length(s)-1 do
  Begin
    Val(s[i],j,x);
     s1:=Copy(s,i+1,length(s));
     inc(k);
     Lap[k]:=nhan(s1,j);

  End;
  bx:=Lap[1];
   For i:=2 to k do
      bx:=cong(Lap[i],bx);
      writeln;
End;
BEGIN
Init;
h:=0;
 For i:=1 to length(s)-1 do
            tongcs(i);
          Val(s[i+1],y,u);
            kq:=F[1];write(F[1],' ');
 For i:=2 to length(s) do
   begin
     kq:=cong(F[i],kq);
   end;
   writeln;
   kq:=cong(kq,C[y]);
   kq:=cong(kq,bx);
readln
end.
 
M

mikelhpdatke

Quên chưa nói thuật. Tính sẵn các tổng dãy ứng với các khoảng 0..9, 0..99, 0..999, 0..9999, ... rồi lưu vào mảng. Sau đó dựa vào mảng này và mảng "lũy thừa của 10" để tính f(n) dựa vào từng chữ số của n từ trái sang phải . Cộng tất cả các kết quả lại được f(n).
 
Q

quanghero100

Thôi thôi. Đừng ngồi đó mà buôn chuyện nữa. Có đề làm nè. Bài này cũng khá dễ.
Xét tập tất cả các phân số tối giản nằm trong đoạn từ 0 đến 1, với mẫu số là số nguyên dương nhỏ hơn hoặc bằng N tử số là các số nguyên không âm.
Ví dụ, với n=5 thì tập này gồm các phân số sau: [TEX]\frac{0}{1} , \frac{1}{5} , \frac{1}{4} , \frac{1}{3} , \frac{2}{5} , \frac{1}{2} , \frac{3}{5} , \frac{2}{3} , \frac{3}{4} , \frac{4}{5} , \frac{1}{1}[/TEX]
Bạn hãy viết 1 CT, cho trước 1 số nguyên N (1 \leq N \leq 100), ghi ra các phân số theo thứ tự tăng dần.
Dữ liệu: File vào gồm 1 dòng chứa đúng 1 số nguyên N.
Kết quả: file ra chứa tất cả các phân số theo thứ tự tăng dần, mỗi phân số ghi trên 1 dòng theo định dạng trong ví dụ dưới đây.
Ví dụ:
frac.inp:
5
frac.out
0/1
1/5
1/4
1/3
2/5
1/2
3/5
2/3
3/4
4/5
1/1
Mọi người làm thử đi nha :D
Mã:
uses crt;
var a:array[1..100,1..100] of real;
    b:array[1..10000] of real;
    f:text;
    i,j,n,d:integer;
procedure nhap;
var i,j,z,t:integer;
begin
  assign(f,'frac.inp');
  reset(f);
  readln(f,n);
  for i:=1 to n do
    for j:=1 to n do
     begin
      a[i,j]:=i/j;
      inc(d);
      b[d]:=a[i,j];
     end;
  for i:=1 to n do
    for j:=1 to n do
      for z:=1 to n do
        for t:=j+1 to n do
         if a[i,j]=a[z,t] then a[z,t]:=0;
  close(f);
end;

procedure quicksort(l,h:integer);
var x,tg:real;
begin
  i:=l;
  j:=h;
  x:=b[random(h-l+1)+l];
  repeat
  while b[i]<x do inc(i);
  while b[j]>x do dec(j);
  if i<=j then
    begin
       tg:=b[i];
       b[i]:=b[j];
       b[j]:=tg;
       inc(i);
       dec(j);
    end;
  until i>j;
  if i<h then quicksort(i,h);
  if l<j then quicksort(l,j);

end;

procedure xuli;
var t:real;
    i,j,z:integer;
begin
 assign(f,'frac.out');
 rewrite(f);
  quicksort(1,n*n);
  writeln(f,0,'/',1);
  t:=0;
  for i:=1 to n*n do
   if (b[i]>t) and (b[i]<1) then
     begin
        for j:=1 to n do
          for z:=1 to n do
               if b[i]=a[j,z] then
               begin
                  writeln(f,j,'/',z);
                  a[j,z]:=0;
                  t:=b[i];
                  break;
               end;
        if b[i]>=1 then break;
     end;
  writeln(f,1,'/',1);
 close(f);
end;

begin
  nhap;
  xuli;
end.
 
Last edited by a moderator:
C

cuong276

Sau gần 48h cả ăn ngủ lọ mọ cũng làm được bài này. Sai báo lại cho mình nhà

Bài 1 : Tổng các chữ số
Cho số nguyên dương n. VIết các số nguyên liên tiếp từ 1 tới n trong hệ thập phân để tạo ra một dãy các chữ số. Hãy tính tổng các chữ số của dãy.

Ví dụ : với n = 12, ta có dãy chữ số 123456789101112 với tổng là 51.

Test n=
12
123
2468
13579
12481632
23456789
9876543210
123123123123
123456789123456789
98765432100123456789

Mã:
Program Bai_1;
Type mang = array[1..9] Of String;
Var st,s,kq,bx:string;
   k,i,j,N,h,y,u:integer;
   Lap,A,F,C:array[1..21] Of string;

Function Cong(a,b:string):string;
Var s:string;
    t,i:integer;
   Begin
    While (length(a)<length(b)) do a:='0'+a;
    While (length(b)<length(a)) do b:='0'+b;
    s:='';
    t:=0;
     For i:=length(a) downto 1 do
      Begin
       t:=t+ord(a[i])+ord(b[i])-96;
       s:=chr(t mod 10 +48)+s;
       t:=t div 10;
      End;
     If t>0 then s:=chr(t+48)+s;
     cong:=s;
     Exit;
    End;
Function nhan(a:string;b:longint):string;
 Var i,t:integer;
    s:string;
  Begin
   s:='';
   t:=0;
    For i:=length(a) downto 1 do
     Begin
      t:=t+(ord(a[i])-48)*b;
      s:=chr(t mod 10 +48)+s;
      t:=t div 10;
     End;
    If t>0 then s:=chr(t+48)+s;
   While (length(s)>1) and (s[1]='0') do Delete(s,1,1);
   nhan:=s;
   Exit;
  End;


Function tongcs(i:integer):string;
   Var j,x,q,df,l:integer;
       bs,khong,st,p,sum,s1,s2,c,sumcs:string;
       ch:Char;
    Begin
      if s[i]='0' then exit;
      khong:='';
      st:='';
      sumcs:='1';
      c:='1';
      bs:='';
      df:=0;
      Val(s[i],x,q);
     For j:=1 to length(s)-i do khong:=khong+'0';
     For j:=2 to x-1 do
      Begin
       Str(j,s2);
       sumcs:=cong(sumcs,s2);
      End;
     sumcs:=sumcs+khong;
     st:=s[i]+khong;
     sum:=A[length(khong)];
     If s[i]>'1' then
      Begin
      sum:=cong(cong(nhan(sum,x),s[i]),sumcs);
      inc(h);
      F[h]:=sum;
     End Else
      Begin
       inc(h);
       F[h]:=(cong(sum,s[i]));
      End;


End;
Procedure Init;
Var d,j,i,x:integer;
  s1,s2,si:string;
 Begin
 C[1]:='1';
 C[2]:='3';
 C[3]:='6';
 C[4]:='10';
 C[5]:='15';
 C[6]:='21';
 C[7]:='28';
 C[8]:='36';
 C[9]:='45';
 A[1]:='45';
 A[2]:='900';
 A[3]:='13500';
 A[4]:='180000';
 A[5]:='2250000';
 A[6]:='27000000';
 A[7]:='315000000';
 A[8]:='3600000000';
 A[9]:='40500000000';
A[10]:='450000000000';
A[11]:='4950000000000';
A[12]:='54000000000000';
A[13]:='585000000000000';
A[14]:='6300000000000000';
A[15]:='67500000000000000';
A[16]:='720000000000000000';
A[17]:='7650000000000000000';
A[18]:='81000000000000000000';
A[19]:='855000000000000000000';
A[20]:='9000000000000000000000';


k:=0;
Write('Nhap N:');Readln(s);
 For i:=1 to length(s)-1 do
  Begin
    Val(s[i],j,x);
     s1:=Copy(s,i+1,length(s));
     inc(k);
     Lap[k]:=nhan(s1,j);

  End;
  bx:=Lap[1];
   For i:=2 to k do
      bx:=cong(Lap[i],bx);
      writeln;
End;
BEGIN
Init;
h:=0;
 For i:=1 to length(s)-1 do
            tongcs(i);
          Val(s[i+1],y,u);
            kq:=F[1];write(F[1],' ');
 For i:=2 to length(s) do
   begin
     kq:=cong(F[i],kq);
   end;
   writeln;
   kq:=cong(kq,C[y]);
   kq:=cong(kq,bx);
readln
end.
Xem lại bài đi nha. Không biết chương trình của cậu sai chỗ nào nhưng tớ chỉ thử N=12 mà chương trình hiện tổng là 46
 
C

cuong276

Đúng là chương trình có chỗ sai thật rồi. Mình thử từ 10 đến 19 mà nó chỉ ra 1 kết quả duy nhất là 46. Thử từ 20 đến 29 lại được kết quả là 102. Có lẽ không cần thử tiếp nữa đâu. Cậu kiểm tra lại nha.
 
C

cuong276

Mã:
uses crt;
var a:array[1..100,1..100] of real;
    b:array[1..10000] of real;
    f:text;
    i,j,n,d:integer;
procedure nhap;
var i,j,z,t:integer;
begin
  assign(f,'frac.inp');
  reset(f);
  readln(f,n);
  for i:=1 to n do
    for j:=1 to n do
     begin
      a[i,j]:=i/j;
      inc(d);
      b[d]:=a[i,j];
     end;
  for i:=1 to n do
    for j:=1 to n do
      for z:=j+1 to n do
         if a[i,j]=a[j,z] then a[j,z]:=0;
  close(f);
end;

procedure quicksort(l,h:integer);
var x,tg:real;
begin
  i:=l;
  j:=h;
  x:=b[random(h-l+1)+l];
  repeat
  while b[i]<x do inc(i);
  while b[j]>x do dec(j);
  if i<=j then
    begin
       tg:=b[i];
       b[i]:=b[j];
       b[j]:=tg;
       inc(i);
       dec(j);
    end;
  until i>j;
  if i<h then quicksort(i,h);
  if l<j then quicksort(l,j);

end;

procedure xuli;
var t:real;
    i,j,z:integer;
begin
 assign(f,'frac.out');
 rewrite(f);
  quicksort(1,n*n);
  writeln(f,0,'/',1);
  t:=0;
  for i:=1 to n*n do
   if (b[i]>t) and (b[i]<1) then
     begin
        for j:=1 to n do
          for z:=1 to n do
               if b[i]=a[j,z] then
               begin
                  writeln(f,j,'/',z);
                  a[j,z]:=0;
                  t:=b[i];
                  break;
               end;
        if b[i]>=1 then break;
     end;
  writeln(f,1,'/',1);
 close(f);
end;

begin
  nhap;
  xuli;
end.

Cậu xem lại tí nha. Khi tớ nhấn F9 thấy chương trình báo lỗi gì gì mà Too many variables đó. Hình như cậu cho quá nhiều biến thì phải.
 
M

mikelhpdatke

Mã:
Program Bai_1;
Type mang = array[1..9] Of String;
Var st,s,kq,bx:string;
   k,i,j,N,h,y,u:integer;
   Lap,A,F,C:array[1..21] Of string;

Function Cong(a,b:string):string;
Var s:string;
    t,i:integer;
   Begin
    While (length(a)<length(b)) do a:='0'+a;
    While (length(b)<length(a)) do b:='0'+b;
    s:='';
    t:=0;
     For i:=length(a) downto 1 do
      Begin
       t:=t+ord(a[i])+ord(b[i])-96;
       s:=chr(t mod 10 +48)+s;
       t:=t div 10;
      End;
     If t>0 then s:=chr(t+48)+s;
     cong:=s;
     Exit;
    End;
Function nhan(a:string;b:longint):string;
 Var i,t:integer;
    s:string;
  Begin
   s:='';
   t:=0;
    For i:=length(a) downto 1 do
     Begin
      t:=t+(ord(a[i])-48)*b;
      s:=chr(t mod 10 +48)+s;
      t:=t div 10;
     End;
    If t>0 then s:=chr(t+48)+s;
   While (length(s)>1) and (s[1]='0') do Delete(s,1,1);
   nhan:=s;
   Exit;
  End;


Function tongcs(i:integer):string;
   Var j,x,q,df,l:integer;
       bs,khong,st,p,sum,s1,s2,c,sumcs:string;
       ch:Char;
    Begin
      if s[i]='0' then exit;
      khong:='';
      st:='';
      sumcs:='1';
      c:='1';
      bs:='';
      df:=0;
      Val(s[i],x,q);
     For j:=1 to length(s)-i do khong:=khong+'0';
     For j:=2 to x-1 do
      Begin
       Str(j,s2);
       sumcs:=cong(sumcs,s2);
      End;
     sumcs:=sumcs+khong;
     st:=s[i]+khong;
     sum:=A[length(khong)];
     If s[i]>'1' then
      Begin
      sum:=cong(cong(nhan(sum,x),s[i]),sumcs);
      inc(h);
      F[h]:=sum;
     End Else
      Begin
       inc(h);
       F[h]:=(cong(sum,s[i]));
      End;


End;
Procedure Init;
Var d,j,i,x:integer;
  s1,s2,si:string;
 Begin
 C[1]:='1';
 C[2]:='3';
 C[3]:='6';
 C[4]:='10';
 C[5]:='15';
 C[6]:='21';
 C[7]:='28';
 C[8]:='36';
 C[9]:='45';
 A[1]:='45';
 A[2]:='900';
 A[3]:='13500';
 A[4]:='180000';
 A[5]:='2250000';
 A[6]:='27000000';
 A[7]:='315000000';
 A[8]:='3600000000';
 A[9]:='40500000000';
A[10]:='450000000000';
A[11]:='4950000000000';
A[12]:='54000000000000';
A[13]:='585000000000000';
A[14]:='6300000000000000';
A[15]:='67500000000000000';
A[16]:='720000000000000000';
A[17]:='7650000000000000000';
A[18]:='81000000000000000000';
A[19]:='855000000000000000000';
A[20]:='9000000000000000000000';


k:=0;
Write('Nhap N:');Readln(s);
 For i:=1 to length(s)-1 do
  Begin
    Val(s[i],j,x);
     s1:=Copy(s,i+1,length(s));
     inc(k);
     Lap[k]:=nhan(s1,j);

  End;
  bx:=Lap[1];
   For i:=2 to k do
      bx:=cong(Lap[i],bx);
      writeln;
End;
BEGIN
Init;
h:=0;
 For i:=1 to length(s)-1 do
            tongcs(i);
          Val(s[i+1],y,u);
            kq:=F[1];
 For i:=2 to length(s) do
   begin
     kq:=cong(F[i],kq);
   end;
   writeln;
   kq:=cong(kq,C[y]);
   kq:=cong(kq,bx);
[COLOR="Red"]   writeln(kq);[/COLOR]
readln
end.

Không phải mình sai mà mình thiếu lệnh write in kq ~~. CÒn việc in ra 46 là kq để mình kt xem tét của đúng hay ko thôi. Mình đã sửa theo code trên
 
C

cuong276

OK! Đúng rồi! Bây giờ tập trung vào làm bài của thiennu274 ra đi nha
Có bài này hay nè, post lên cho mấy anh em làm. Rồi ôn thi luôn :D ( zí lại cái bài này mình cũng đang nhức đầu vì nó, post lên chia sẻ luôn). Không nhớ đề lắm nhaz, ai muốn rõ thêm thì liên hệ

Cho Robot đang ở vị trí trên tọa độ A(x,y)
Tìm điểm đến của một Robot trên A(x,y) theo một chuỗi cho trước, và định theo 1 quy luật sẵn:
Dm: cho robot đi lên theo m
dm: cho robot lùi theo m
Qm: cho robot quay một góc 45 m lần theo chiều kim đồng hồ
qm: cho robot quay một góc 45 m lần ngược chiều kim đồng hồ
Nhập vào một chuỗi theo quy luật, in ra tọa độ A(x,y) mà robot đến


Đại loại cái bài là thế. Rất tiếc mình quên ví dụ. Ráng hiểu nhaz, mấy bạn cũng thông minh mà hé [/COLOR]
 
Last edited by a moderator:
Q

quanghero100

Cậu xem lại tí nha. Khi tớ nhấn F9 thấy chương trình báo lỗi gì gì mà Too many variables đó. Hình như cậu cho quá nhiều biến thì phải.

lúc nảy tớ có vào chỉnh lại một tý những test vẫn đúng mà, biến có gì đâu mà nhìu có vài biến chứ mấy hay là cậu bỏ hai biến toàn cục i,j thử xem sao chứ tớ chạy đúng cả haizzz
 
C

cuong276

Mã:
uses crt;
var a:array[1..100,1..100] of real;
    [COLOR="Red"]b:array[1..10000] of real;[/COLOR]
    f:text;
    i,j,n,d:integer;
procedure nhap;
var i,j,z,t:integer;
begin
  assign(f,'frac.inp');
  reset(f);
  readln(f,n);
  for i:=1 to n do
    for j:=1 to n do
     begin
      a[i,j]:=i/j;
      inc(d);
      b[d]:=a[i,j];
     end;
  for i:=1 to n do
    for j:=1 to n do
      for z:=j+1 to n do
         if a[i,j]=a[j,z] then a[j,z]:=0;
  close(f);
end;

procedure quicksort(l,h:integer);
var x,tg:real;
begin
  i:=l;
  j:=h;
  x:=b[random(h-l+1)+l];
  repeat
  while b[i]<x do inc(i);
  while b[j]>x do dec(j);
  if i<=j then
    begin
       tg:=b[i];
       b[i]:=b[j];
       b[j]:=tg;
       inc(i);
       dec(j);
    end;
  until i>j;
  if i<h then quicksort(i,h);
  if l<j then quicksort(l,j);

end;

procedure xuli;
var t:real;
    i,j,z:integer;
begin
 assign(f,'frac.out');
 rewrite(f);
  quicksort(1,n*n);
  writeln(f,0,'/',1);
  t:=0;
  for i:=1 to n*n do
   if (b[i]>t) and (b[i]<1) then
     begin
        for j:=1 to n do
          for z:=1 to n do
               if b[i]=a[j,z] then
               begin
                  writeln(f,j,'/',z);
                  a[j,z]:=0;
                  t:=b[i];
                  break;
               end;
        if b[i]>=1 then break;
     end;
  writeln(f,1,'/',1);
 close(f);
end;

begin
  nhap;
  xuli;
end.

Chương trình báo lỗi chỗ đỏ này nè. Chương trình ghi là Error 96: Too many variables. Mình sửa số 10000 đó thành 100 chương trình mới chịu chạy.
 
M

mikelhpdatke

Biểu thức đại số
Cho số nguyên (-100 K 100) và một dãy gồm N số nguyên a[1], a[2],…,a[n] với 1 < n 40 và 1 a 100.
Yêu cầu:
Hãy xác định xem có bao nhiêu cách điền vào giữa tất cả các số trong dãy đã cho các dấu cộng (+) hoặc trừ (-) để thu được một biểu thức có giá trị bằng K.
Ví dụ: Với K = 2 và dãy gồm 6 số: 1 2 1 2 6 2 thì ta có tất cả 2 cách điền:
1 + 2 + 1 + 2 - 6 + 2 = 2
1 - 2 + 1 - 2 + 6 - 2 = 2
Input: File văn bảnEXP.INP có 2 dòng:
· Dòng 1: Ghi 2 số nguyên n, K mỗi số cách nhau một dấu cách.
· Dòng 2: Ghi n số nguyên a[1], a[2],…,a[n] , mỗi số cách nhau một dấu cách.
Output: File văn bảnEXP.OUT ghi một số nguyên m là số cách điền dấu cộng hoặc trừ vào giữa tất cả các số trong dãy đã cho để được một biểu thức có giá trị bằng K.
Ví dụ:
EXP.INP
EXP.OUT
6 2
1 2 1 2 6 2


2


Mình cũng có bài này. Thuật quay lui mình mới nghĩ ra nhưng chưa code. Mn thì nghĩ thuật QHĐ xem sao :-?
 
T

thiennu274

Có bài này hay nè, post lên cho mấy anh em làm. Rồi ôn thi luôn :D ( zí lại cái bài này mình cũng đang nhức đầu vì nó, post lên chia sẻ luôn). Không nhớ đề lắm nhaz, ai muốn rõ thêm thì liên hệ

Cho Robot đang ở vị trí trên tọa độ A(x,y)
Tìm điểm đến của một Robot trên A(x,y) theo một chuỗi cho trước, và định theo 1 quy luật sẵn:
Dm: cho robot đi lên theo m
dm: cho robot lùi theo m
Qm: cho robot quay một góc 45 m lần theo chiều kim đồng hồ
qm: cho robot quay một góc 45 m lần ngược chiều kim đồng hồ
Nhập vào một chuỗi theo quy luật, in ra tọa độ A(x,y) mà robot đến


Đại loại cái bài là thế. Rất tiếc mình quên ví dụ. Ráng hiểu nhaz, mấy bạn cũng thông minh mà hé [/COLOR]
Có bạn nào có ý tưởng với cái bài robot của mình chưa nhỉ???? :-?
 
C

cuong276

Bài của Thiên Nữ cố tìm ra ví dụ đi. Đề như thế mình không hình dung được cái gì cả. Còn bài của Đạt để mình đọc cái đề đã rồi tính sau.
 
Status
Không mở trả lời sau này.
Top Bottom