Đến nội dung

Hình ảnh

Lập trình Pascal

pascal

  • Please log in to reply
Chủ đề này có 200 trả lời

#61
nghethuat102

nghethuat102

    Trung sĩ

  • Thành viên
  • 147 Bài viết

Chương trình hay đấy chứ em!

Em thử nói điều hạn chế mà em thấy cần khắc phục xem mọi người có giúp gì được không?

Điều hạn chế của em lo ngại ở đây là :

  - Nếu có tập hợp các số đều bằng nhau thì text kết quả sẻ bị lặp.



#62
nghethuat102

nghethuat102

    Trung sĩ

  • Thành viên
  • 147 Bài viết

Bạn dùng đệ quy quay lui à? cái đó mấy bữa nữa mình tính học lại chứ bây giờ còn lờ mờ quá

Ừ, là đệ quy quay lui, nhưng cái đệ quy quay lui này cũng chỉ áp dụng cho số nhỏ chứ lớn thì không đảm bảo yêu cầu lắm!!



#63
hocpascal

hocpascal

    Trung sĩ

  • Thành viên
  • 109 Bài viết

Ừ, là đệ quy quay lui, nhưng cái đệ quy quay lui này cũng chỉ áp dụng cho số nhỏ chứ lớn thì không đảm bảo yêu cầu lắm!!

 

 

       Bài này khó chịu quá tui làm bị lỗi test s1=abc, s2=bca

Điền khuyết xâu kí tự     

Cho trước 2 xâu ký tự a, b (chiều dài của mỗi xâu không quá 100).

            Yêu cầu: Viết chương trình bổ sung một số ký tự vào a và một số ký tự vào b để hai xâu a và b trở nên giống nhau (phân biệt chữ hoa, thường). Tổng số kí tự bổ sung vào là ít nhất.

            Input: File văn bản fs.inp cấu trúc như sau:

  • Bao gồm một số dòng (là số chẵn, có thể lên đến 10.000 dòng).
  • Mỗi dòng là một xâu kí tự (không quá 100 kí tự).

Output: File văn bản fs.out cấu trúc như sau:

  • Gồm một số dòng (là số dòng của file input chia 2)
  • Dòng thứ i chứa xâu kí tự là kết quả của việc bổ sung 2 xâu tại dòng thứ i*2-1 và i*2 trên file input.

Ví dụ: s1=Abcde , s2=Abdf thì ta được Abcdef



#64
nghethuat102

nghethuat102

    Trung sĩ

  • Thành viên
  • 147 Bài viết


       Bài này khó chịu quá tui làm bị lỗi test s1=abc, s2=bca

Điền khuyết xâu kí tự     

Cho trước 2 xâu ký tự a, b (chiều dài của mỗi xâu không quá 100).

            Yêu cầu: Viết chương trình bổ sung một số ký tự vào a và một số ký tự vào b để hai xâu a và b trở nên giống nhau (phân biệt chữ hoa, thường). Tổng số kí tự bổ sung vào là ít nhất.

            Input: File văn bản fs.inp cấu trúc như sau:

  • Bao gồm một số dòng (là số chẵn, có thể lên đến 10.000 dòng).

  • Mỗi dòng là một xâu kí tự (không quá 100 kí tự).

Output: File văn bản fs.out cấu trúc như sau:

  • Gồm một số dòng (là số dòng của file input chia 2)

  • Dòng thứ i chứa xâu kí tự là kết quả của việc bổ sung 2 xâu tại dòng thứ i*2-1 và i*2 trên file input.

Ví dụ: s1=Abcde , s2=Abdf thì ta được Abcdef

var f,g:text;
    s1,s2,s:string;
    i,j:integer;
begin
assign(f,'');
reset(f);
assign(g,'');
rewrite(g);
 while not eoln(f) do
       begin
       readln(f,s1);
       readln(f,s2);
       i:=1;
       repeat
        if length(s2)>length(s1) then
           begin
             s:=s2;
             s2:=s1;
             s1:=s;
           end;
        if s1[i]<>s2[i] then insert(s1[i],s2,i);
        i:=i+1;
       until pos(s2,s1)<>0;
       writeln(g,s1);
       end;
 close(f);
 close(g);
 end.
 
 Bạn điền tên file inp,out vào là đc! Nếu có thể thêm thì xét trường hợp 2 xâu chả có gì liên quan(vd: abcg,def => abcgdef), vì text của cách mình không có chia cho trường hợp đó!


#65
nghethuat102

nghethuat102

    Trung sĩ

  • Thành viên
  • 147 Bài viết

       Bài này khó chịu quá tui làm bị lỗi test s1=abc, s2=bca

                                                  ...

Ví dụ: s1=Abcde , s2=Abdf thì ta được Abcdef

Sẵn cũng có 1 bài về xâu mà làm chưa ra, đăng lên cùng làm : :luoi:

Một chuỗi được gọi là đối xứng (palindrome) nếu như khi đọc chuỗi này từ phải sang trái cũng thu được chuỗi ban đầu.

Yêu cầu: tìm một chuỗi con đối xứng dài nhất của một chuỗi s cho trước. Chuỗi con là chuỗi thu được khi xóa đi một số ký tự từ chuỗi ban đầu.

Dữ liệu vào

Gồm một dòng duy nhất chứa chuỗi s, chỉ gồm những chữ cái in thường.

Kết qủa

Gồm một dòng duy nhất là một xâu con đối xứng dài nhất của xâu s. Nếu có nhiều kết quả, chỉ cần in ra một kết quả bất kỳ.

Giới hạn

Chuỗi s có độ dài không vượt quá 2000.

Ví dụ

Dữ liệu mẫu
lmevxeyzl

Kết qủa
level



#66
ilovelife

ilovelife

    Sĩ quan

  • Thành viên
  • 371 Bài viết

 

var f,g:text;
    s1,s2,s:string;
    i,j:integer;
begin
assign(f,'');
reset(f);
assign(g,'');
rewrite(g);
 while not eoln(f) do
       begin
       readln(f,s1);
       readln(f,s2);
       i:=1;
       repeat
        if length(s2)>length(s1) then
           begin
             s:=s2;
             s2:=s1;
             s1:=s;
           end;
        if s1[i]<>s2[i] then insert(s1[i],s2,i);
        i:=i+1;
       until pos(s2,s1)<>0;
       writeln(g,s1);
       end;
 close(f);
 close(g);
 end.
 
 Bạn điền tên file inp,out vào là đc! Nếu có thể thêm thì xét trường hợp 2 xâu chả có gì liên quan(vd: abcg,def => abcgdef), vì text của cách mình không có chia cho trường hợp đó!

 

Bài toán quy hoạch động cổ điển: tham khảo  Levenshtein distance

 

Sẵn cũng có 1 bài về xâu mà làm chưa ra, đăng lên cùng làm : :luoi:

Một chuỗi được gọi là đối xứng (palindrome) nếu như khi đọc chuỗi này từ phải sang trái cũng thu được chuỗi ban đầu.

Yêu cầu: tìm một chuỗi con đối xứng dài nhất của một chuỗi s cho trước. Chuỗi con là chuỗi thu được khi xóa đi một số ký tự từ chuỗi ban đầu.

Dữ liệu vào

Gồm một dòng duy nhất chứa chuỗi s, chỉ gồm những chữ cái in thường.

Kết qủa

Gồm một dòng duy nhất là một xâu con đối xứng dài nhất của xâu s. Nếu có nhiều kết quả, chỉ cần in ra một kết quả bất kỳ.

Giới hạn

Chuỗi s có độ dài không vượt quá 2000.

Ví dụ

Dữ liệu mẫu
lmevxeyzl

Kết qủa
level
 

Bài toán quy hoạch động cổ điển: tham khảo LCS

P/S: là test chứ không phải text nhé.


God made the integers, all else is the work of man.

People should not be afraid of their goverment, goverment should be afraid of their people.

 


#67
hocpascal

hocpascal

    Trung sĩ

  • Thành viên
  • 109 Bài viết

ừm, là test !!

Mình kem phần quy hoạch động quá chưa có thời gian học nên khó giải bài đó quá

Phân tích số

            Cho trước một số N nguyên dương. Hãy tìm các số nguyên dương khác nhau sao cho tổng của các số đó bằng N và tích của các số đó là lớn nhất.

Dữ liệu vào: từ tệp văn bản TICH.INP, chứa duy nhất một số N (2<N<100).

Dữ liệu ra: đưa ra tệp văn bản TICH.OUT có hai dòng

- Dòng 1: Chứa số S là số lượng các số tìm được theo yêu cầu

- Dòng 2: Chứa S số tìm được theo thứ tự tăng dần.

Ví dụ:

TICH.INP

TICH.OUT

10

3

2 3 5

Bài này không dùng đệ quy có được không ban?



#68
nghethuat102

nghethuat102

    Trung sĩ

  • Thành viên
  • 147 Bài viết

Mình kem phần quy hoạch động quá chưa có thời gian học nên khó giải bài đó quá

Phân tích số

            Cho trước một số N nguyên dương. Hãy tìm các số nguyên dương khác nhau sao cho tổng của các số đó bằng N và tích của các số đó là lớn nhất.

Dữ liệu vào: từ tệp văn bản TICH.INP, chứa duy nhất một số N (2<N<100).

Dữ liệu ra: đưa ra tệp văn bản TICH.OUT có hai dòng

- Dòng 1: Chứa số S là số lượng các số tìm được theo yêu cầu

- Dòng 2: Chứa S số tìm được theo thứ tự tăng dần.

Ví dụ:

TICH.INP

TICH.OUT

10

3

2 3 5

Bài này không dùng đệ quy có được không ban?

à, bài này đừng dùng đệ quy mà lâu bạn, nên dùng 1 thuật toán bình thường thôi!

      nó có 1 bài liên quan là " cho số nguyên dương n, phân tích thành tổng của các số nguyên dương khác nhau "

                                    vd: n=5

                                          5=1+1+1+1+1=4+1=3+1+1=3+2=2+2+1 



#69
hocpascal

hocpascal

    Trung sĩ

  • Thành viên
  • 109 Bài viết

nhưng vn n=9 thì nếu phân tích thành tổng các số nguyên dương khác nhau => 9=2+3+4 có tích=24

tuy nhiên thì 9=3+3+3 có tích =27>24 mà do vậy không đc



#70
hocpascal

hocpascal

    Trung sĩ

  • Thành viên
  • 109 Bài viết


nhưng vn n=9 thì nếu phân tích thành tổng các số nguyên dương khác nhau => 9=2+3+4 có tích=24

tuy nhiên thì 9=3+3+3 có tích =27>24 mà do vậy không đc

Cuoi cung van dung de quy huhu

 {phan tich N thanh tong cac so khac nhau sao cho tich cua cac so la lon nha}
 var a,t,b: array[0..100000] of longint;
 i,j,k,n,h,d,luumax:longint;
function tich(i: longint):longint;
var j,ti: longint;
begin
ti:=1;
for j:=1 to i do
ti:=ti*a[j];
tich:=ti;
end;
function kt(i: integer): boolean;
var c,d: integer;
begin
kt:=true;
for c:=1 to i-1 do
for d:=c+1 to i do
if a[c]=a[d] then
begin
kt:=false; break;
end;
end;
procedure try(i:longint);
var j,k,max,l:longint; tam,s: string;
 begin
 d:=0;
 for j:=a[i-1] to (n-t[i-1]) div 2 do
 begin
 a[i]:=j;
 t[i]:=t[i-1]+j;
try(i+1);
 end;
  a[i]:=n-t[i-1];
if (a[i]=n-t[i-1]) and kt(i) then
begin
  max:=tich(i);
  if max>luumax then
 luumax:=max;
 if luumax=max then
  for h:=1 to i do
  b[h]:=a[h];
end;
end;
begin
read(n);
t[0]:=0;
a[0]:=1;
try(1);
writeln(' day co tich lon nhat bang  :',luumax);
write(n,'=',b[1]);
for i:=2 to h do
write('+',b[i]);
 readln;
 readln
 end.


#71
hocpascal

hocpascal

    Trung sĩ

  • Thành viên
  • 109 Bài viết

!! 2 ngay nua minh moi lam dc ,vi may nha dang hong nen khong ranh !!

Bài này không dùng quy hoạch động, bạn xem giải được không hộ tôi nha

Xét một dãy số nguyên gồm N phần tử. Viết dãy số đó theo thứ tự từ trái sang phải, sau đó đặt giữa mỗi cặp số cạnh nhau dấu cộng '+' hoặc trừ '-', khi đó ta thu được một biểu thức số học. Ta nói dãy số là chia hết cho K nếu tồn tại một cách đặt dấu để thu được biểu thức số học chia hết cho K.

Yêu cầu: Hãy xác định dãy số đã cho có chia hết cho K hay không.



#72
nghethuat102

nghethuat102

    Trung sĩ

  • Thành viên
  • 147 Bài viết

Bài này không dùng quy hoạch động, bạn xem giải được không hộ tôi nha

Xét một dãy số nguyên gồm N phần tử. Viết dãy số đó theo thứ tự từ trái sang phải, sau đó đặt giữa mỗi cặp số cạnh nhau dấu cộng '+' hoặc trừ '-', khi đó ta thu được một biểu thức số học. Ta nói dãy số là chia hết cho K nếu tồn tại một cách đặt dấu để thu được biểu thức số học chia hết cho K.

Yêu cầu: Hãy xác định dãy số đã cho có chia hết cho K hay không.

dùng đệ quy quay lui giống bài trc đó bạn gửi đc k? 

Bài toán: Cho bốn số tự nhiên. hãy đặt các dấu (+ , -) vào các số sao cho tổng chia hết cho 10



#73
hocpascal

hocpascal

    Trung sĩ

  • Thành viên
  • 109 Bài viết

OK mình cung đang học quay lui chứ không những bài này làm theo thuật toán bình thường vất vả lắm mà không hiệu quả

Bài toán: Cho phân số M/N (0<M<N, M,n nguyên). hãy liệt kê tất cả các cách phân tích sao cho phân số M/N bằng hiệu các phân số có tử số bằng 1. 

Bài này tổng thì ok nhưng mình chế thành hiệu thì liệu có phân tích được không ban



#74
nghethuat102

nghethuat102

    Trung sĩ

  • Thành viên
  • 147 Bài viết

Bài toán: Cho phân số M/N (0<M<N, M,n nguyên). hãy liệt kê tất cả các cách phân tích sao cho phân số M/N bằng hiệu các phân số có tử số bằng 1. 

Bài này tổng thì ok nhưng mình chế thành hiệu thì liệu có phân tích được không ban

chắc được, hôm qua đọc nhầm đề tưởng tim ra 1 cách phân tích thôi nên vẫn làm chưa ra!!



#75
nghethuat102

nghethuat102

    Trung sĩ

  • Thành viên
  • 147 Bài viết

Bài toán: Cho phân số M/N (0<M<N, M,n nguyên). hãy liệt kê tất cả các cách phân tích sao cho phân số M/N bằng hiệu các phân số có tử số bằng 1. 

Bài này tổng thì ok nhưng mình chế thành hiệu thì liệu có phân tích được không ban

nhưng liệu cách liệt kê thành tổng bạn có thể đếm hết chăng?? vd :1/2=1/4+1/4=1/8+1/8+1/8+1/8=... theo mẫu là hệ cơ số 2 và số phần tử x2!!



#76
hocpascal

hocpascal

    Trung sĩ

  • Thành viên
  • 109 Bài viết

nhưng liệu cách liệt kê thành tổng bạn có thể đếm hết chăng?? vd :1/2=1/4+1/4=1/8+1/8+1/8+1/8=... theo mẫu là hệ cơ số 2 và số phần tử x2!!

mình chỉ đưa ra một cách rồi exit thôi chứ đưa các cách mình chưa làm



#77
nghethuat102

nghethuat102

    Trung sĩ

  • Thành viên
  • 147 Bài viết

mình chỉ đưa ra một cách rồi exit thôi chứ đưa các cách mình chưa làm

Vậy thì hiệu cũng có thể làm, nếu m<n thì m/n=1-1/n-...-1/n cho đến khi bằng m/n thì thôi !!



#78
hocpascal

hocpascal

    Trung sĩ

  • Thành viên
  • 109 Bài viết

Vậy thì hiệu cũng có thể làm, nếu m<n thì m/n=1-1/n-...-1/n cho đến khi bằng m/n thì thôi !!

Bạn xem có thuật toán giải bài này dễ hiểu một chút không nhe

“Số rắn hai đầu” “Số rắn hai đầu” là một số nguyên dương N sao cho: khi thêm hai chữ số a, b vào hai đầu số N ấy (theo dạng ) sẽ được số mới có giá trị nâng lên 99 lần. Tức là:

Cho trước hai chữ số nguyên a, b (0 ≤ a, b ≤ 9). Tìm “Số rắn hai đầu” N?
Tổ chức dữ liệu:

• Dữ liệu vào: từ tập tin Serpent.inp gồm 2 số a, b cách nhau một dấu cách.
• Dữ liệu ra: là tập tin Serpent.out chứa số N cần tìm. Trong trường hợp có nhiều hơn một số N thỏa mãn, hãy đưa ra số bé nhất.
Cho biết với dữ liệu vào, luôn tồn tại kết quả.
Ví dụ:
Serpent.inp Serpent.out
8 1 9
1 4 11236
8 5 8988764045
& Giải thích:

• 9 × 99 = 891 11236 × 99 = 1112364 8988764045 × 99 = 889887640455     



#79
hocpascal

hocpascal

    Trung sĩ

  • Thành viên
  • 109 Bài viết

Bạn xem có thuật toán giải bài này dễ hiểu một chút không nhe

“Số rắn hai đầu” “Số rắn hai đầu” là một số nguyên dương N sao cho: khi thêm hai chữ số a, b vào hai đầu số N ấy (theo dạng ) sẽ được số mới có giá trị nâng lên 99 lần. Tức là:

Cho trước hai chữ số nguyên a, b (0 ≤ a, b ≤ 9). Tìm “Số rắn hai đầu” N?
Tổ chức dữ liệu:

• Dữ liệu vào: từ tập tin Serpent.inp gồm 2 số a, b cách nhau một dấu cách.
• Dữ liệu ra: là tập tin Serpent.out chứa số N cần tìm. Trong trường hợp có nhiều hơn một số N thỏa mãn, hãy đưa ra số bé nhất.
Cho biết với dữ liệu vào, luôn tồn tại kết quả.
Ví dụ:
Serpent.inp Serpent.out
8 1 9
1 4 11236
8 5 8988764045
& Giải thích:

• 9 × 99 = 891 11236 × 99 = 1112364 8988764045 × 99 = 889887640455     

Chương trình monh code thế này nhưng có nhiều test không chạy được do kiểu dữ liệu

var a,b,n,k: int64;  i: integer;
kt:boolean;
begin
read(a,b);
n:=a;  kt:=false;
for i:=1 to 200 do
begin
n:=n*10;
if (n+b) mod 89=0 then
begin
kt:=true;
k:=(n+b) div 89;
break;
end;
end;
if kt then
write(k) else
write('-1');
readln;
readln
end.


#80
nghethuat102

nghethuat102

    Trung sĩ

  • Thành viên
  • 147 Bài viết

Bạn xem có thuật toán giải bài này dễ hiểu một chút không nhe

......
• 9 × 99 = 891 11236 × 99 = 1112364 8988764045 × 99 = 889887640455     

var s,thuong:string;    a,b:char;  c:boolean;
    n:integer;
    function timdu(s:string):string;
        var du,so:string;   i,j,m,t:integer;
        begin
          so:=s;
          thuong:='';
          du:='0';
          m:=0;
          for i:=1 to length(so) do
               begin
                 val(so[i],t,j);
                 m:=m+t;
                 if m>=89 then
                        begin
                          str(m div 89,du);
                          thuong:=thuong+du;
                          m:=m mod 89;
                          str(m,du);
                        end;
                 m:=m*10;
               end;
         timdu:=du;
        end;
begin
write('a=');
readln(a);
write('b=');
readln(b);
c:=false;
s:=a;
    n:=1;
    while c=false do
        begin
         s:=s+'0'+b;
         if timdu(s)='0' then
                begin
                 c:=true;
                 writeln(thuong);
                end
         else
                begin
                 n:=n+1;
                 delete(s,length(s),1);
                end;
 
        end;
readln;
end.
 
 Bạn thử xem đúng hết text không!! Vì chưa thử nghiệm nhiều nên có 1 số text nó đứng!






Được gắn nhãn với một hoặc nhiều trong số những từ khóa sau: pascal

0 người đang xem chủ đề

0 thành viên, 0 khách, 0 thành viên ẩn danh