Phần phân tích tại sao có kết quả này mới quan trọng.
tinh(x,y):
+Khi y=1 áp dụng luật c x lần ta có tinh=x.1*1=x.2=2x=(2x)^1=(2x)^y
+Khi y > 1 áp dụng luật y lần ta có:
tinh=(x*1)^y=(2x)^y.
Tóm lại:
tinh(x,y)=(2x)^y.
Vậy bài này đâu cần đệ quy.
__________________ Necessity is the mother of in(ter)vention.
Speak softly & carry a big stick. My Technical Blog
thay đổi nội dung bởi: myhanh, 26-03-2009 lúc 09:14 PM.
Đây là bài 2 của em, test cái VD thì đúng, nhưng sang chuỗi khác thì sai, chẳng hạn chuỗi 1432412 1 thi no lai ra 11124324
Mấy anh xem hộ em nhá, em thấy cái while có vấn đề thì phải Y.Y
Code:
Program bai2;
Uses crt;
Var a,i,m,n,h,k,kt:integer;
s:string;
Procedure nhap(var s:string);
Begin
Write('Nhap vao chuoi:');readln(s);
end;
{***************************************}
Procedure dem(var s:string;var m,n,h,k,kt:integer);
Begin
m:=0;
n:=0;
h:=0;
k:=0;
For i:=1 to length(s) do begin
if s[i]='1' then m:=m+1;
if s[i]='2' then n:=n+1;
if s[i]='3' then h:=h+1;
if s[i]='4' then k:=k+1;
if s[i]=' ' then kt:=i;
end;
n:=m+n;
h:=n+h;
k:=h+k;
end;
{*********************************************************}
Procedure doicho(var s:string;var kt:integer;i:integer);
Begin
s[kt]:=s[i];
s[i]:=' ';
kt:=i;
end;
{**********************************************************}
Begin
clrscr;
nhap(s);
dem(s,m,n,h,k,kt);
a:=length(s);
While kt<>length(s) do begin
If (kt>=1) and (kt<=m) then
For i:=1 to a do
if (s[i]='1') and (i>m) and (kt<=m) and (kt>=1) then
begin
doicho(s,kt,i);
write(kt:5);
end;
{****************************}
If (kt>m) and (kt<=n) then
For i:=1 to a do
if (s[i]='2') and ((i<=m) or ((i>n) and (i<=k))) and (kt>m) and(kt<=n) then
begin
doicho(s,kt,i);
write(kt:5);
end;
{****************************}
If (kt>n) and (kt<=h) then
For i:=1 to a do
if (s[i]='3') and ((i<=n) or ((i>h) and (i<=k))) and(kt>n)and (kt<=h)then
Begin
doicho(s,kt,i);
write(kt:5);
end;
{*****************************}
If (kt>h) and (kt<=k) then
For i:=1 to a do
if (s[i]='4') and (i<=h) and (kt>h)and (kt<=k) then
begin
doicho(s,kt,i);
write(kt:5);
end;
end;
writeln;
Write(s:5);
Readln;
end.
if s[i]='1' then m:=m+1;
if s[i]='2' then n:=n+1;
if s[i]='3' then h:=h+1;
if s[i]='4' then k:=k+1;
if s[i]=' ' then kt:=i;
Nên dùng case nha (chương trình dễ đọc, chạy nhanh hơn)
Trích:
While kt<>length(s) do begin
If (kt>=1) and (kt<=m) then
For i:=1 to a do
if (s[i]='1') and (i>m) and (kt<=m) and (kt>=1) then
begin
doicho(s,kt,i);
write(kt:5);
end;
{****************************}
If (kt>m) and (kt<=n) then
For i:=1 to a do
if (s[i]='2') and ((i<=m) or ((i>n) and (i<=k))) and (kt>m) and(kt<=n) then
begin
doicho(s,kt,i);
write(kt:5);
end;
{****************************}
If (kt>n) and (kt<=h) then
For i:=1 to a do
if (s[i]='3') and ((i<=n) or ((i>h) and (i<=k))) and(kt>n)and (kt<=h)then
Begin
doicho(s,kt,i);
write(kt:5);
end;
{*****************************}
If (kt>h) and (kt<=k) then
For i:=1 to a do
if (s[i]='4') and (i<=h) and (kt>h)and (kt<=k) then
begin
doicho(s,kt,i);
write(kt:5);
end;
end;
Viết theo kiểu của em lần đầu vào nếu kt ở cuối chuỗi là tiêu Giải thuật của anh
Trích:
Kiểu dữ liệu:
type vitri = record
begin
vitri: array[1..255] of integer;/* vi tri cua so nay trong s*/
index:integer; /*vi tri dau tien trong vitri sai vi tri*/
len:integer; /*tong so thuoc loai nay*/
end;
var so:array[1..4] of vitrisai;
Thủ tục đổi số: doiso(i)
+ Nếu so[i].index > so[i].len thì return
+Ngược lại doicho (s,kt, so[i].vitri[so[i].index])
inc(so[i].index).
+Nếu so[i].vitri[so[i].index] thuộc vùng số j (j=1..4) thì đệ quy doiso(j).
Chương trình chính:
Duyệt qua s và cập nhật các vị trí số 1 vào so[1], số 2 vào so[2], số 3 vào so[3], số 4 vào so[4].
for i:=1 to 4 do doiso(i);
__________________ Necessity is the mother of in(ter)vention.
Speak softly & carry a big stick. My Technical Blog