giúp đệ về môn TIN HỌC với mấy huynh
Bắt đầu bởi nguyen quang hao, 09-12-2007 - 11:53
#1
Đã gửi 09-12-2007 - 11:53
cho một dãy kí tự, viết chuơng trình để chuyển dãy thành dãy đảo ngược VD 123456 chuyển thành 654321
quang hào
#2
Đã gửi 10-12-2007 - 00:14
bạn chuyển dãy kí tự ra số ( dùng ord ) rồi lưu vào mảng, sau đó xuất ra với thứ tự ngược lại.
#3
Đã gửi 10-12-2007 - 19:43
Hoặc bạn cũng có thể lập ra một mảng với kiểu dữ liệu là word rồi lưu luôn cái dãy trên của bạn vào, sau đó lộn ngựoc nó lại bằng phép lặp for ... to/
#4
Đã gửi 11-12-2007 - 07:03
Pascal for i=1 to length(st) write(st[length(st)-i+1));
C, C++ for(i=1;i<=strlen(st);i++) printf("%1c",st[strlen(st)-i+1])
Phải không nhỉ
C, C++ for(i=1;i<=strlen(st);i++) printf("%1c",st[strlen(st)-i+1])
Phải không nhỉ
#5
Đã gửi 12-12-2007 - 15:45
Ý tui không phải vậy nhưng làm cách trên cũng được (thực ra là ngắn hơn)
#6
Đã gửi 13-12-2007 - 06:33
Ý trên đã mập mờ, ý dưới càng mập mờ hơn. Chả hiểuÝ tui không phải vậy nhưng làm cách trên cũng được (thực ra là ngắn hơn)
#7
Đã gửi 13-12-2007 - 20:10
Cách của tui là như thế này:
var A:array[1..n] of char; (với n là biến mà sau này ta cho bằng length(st))
for i:=1 to n do A[i]:=B[n-i]; (B[i] là cái dãy mà ta nhập vào)
for i:=1 to n do write(A[i]);
Đó, cách của tui là như vầy, dài hơn cách của quanghoa nhiều nhưng được cái nó dễ hiểu. OK?
var A:array[1..n] of char; (với n là biến mà sau này ta cho bằng length(st))
for i:=1 to n do A[i]:=B[n-i]; (B[i] là cái dãy mà ta nhập vào)
for i:=1 to n do write(A[i]);
Đó, cách của tui là như vầy, dài hơn cách của quanghoa nhiều nhưng được cái nó dễ hiểu. OK?
#8
Đã gửi 15-12-2007 - 16:58
cam on moi nguoi nha
quang hào
#9
Đã gửi 22-12-2007 - 16:21
bài này chỉ cần 1 mảng với 1 biến tạm
k:=length(s);
for i:=1 to div (length(s),2) do
begin
t:=a[i];
a[i]:=a[k-i+1];
a[k-i+1]:=t;
end;
k:=length(s);
for i:=1 to div (length(s),2) do
begin
t:=a[i];
a[i]:=a[k-i+1];
a[k-i+1]:=t;
end;
#10
Đã gửi 29-12-2007 - 10:53
Bài này là bài mở rộng của bài sau:cho một dãy kí tự, viết chuơng trình để chuyển dãy thành dãy đảo ngược VD 123456 chuyển thành 654321
với bài đó thì cách giải rất đơn giản:Cho một mảng, hãy đưa giá trị đầu tiên về cuối dãy (tạm gọi là mảng A, n là số phần tử của mảng):
Vd dãy là 1 2 3 4 5 6 7 8 9 sẽ thành 2 3 4 5 6 7 8 9 1
T:=A[1]; For i:=1 to N-1 do A[i]:=A[i+1]; A[N]:=T;và bài toán của nguyen quang hao thực chất là bài toán có đề bài cụ thể như sau:
Lập tức, một giải thuật tự nhiên là làm như bài tóan trên, thực hiện K lần như vậy. Lúc này độ phức tạp tính tóan sẽ là O(k.n). Trường hợp K và N lớn thì không ổn.Cho một mảng N phần tử, hãy đưa K (K<=N) phần tử đầu dãy về cuối dãy
Ta có cách tiếp cận khác, ta thử đảo ngược K phần tử đầu của mảng, rồi đảo ngược N-K phần tử cuối của mảng, giả sử K = 3 với dãy như trên ta có dãy sau:
3 2 1 9 8 7 6 5 4
so sánh với dãy kết quả đúng phải là: 4 5 6 7 8 9 1 2 3.
Ta thấy nó là dãy đảo ngược của dãy kết quả => vậy chỉ cần đảo ngược tòan bộ mảng một lần nữa thôi.
Như vậy ta có thuật tóan chạy với độ phức tạp là O(2n) không phụ thuộc vào K.
For i:=1 to K div 2 do begin A[i] :=A[k-i +1] XOR A[i]; A[k-i + 1]:=A[k-i +1] XOR A[i]; A[i] :=A[k-i +1] XOR A[i]; end; For i:=K+1 to (N-K) div 2 do begin A[i] :=A[i] XOR A[N-i +K+1]; A[N-i +K+1]:=A[i] XOR A[N-i +K+1]; A[i] :=A[i] XOR A[N-i +K+1]; end; For i:=1 to N div 2 do begin A[i] :=A[N-i +1] XOR A[i]; A[N-i + 1]:=A[N-i +1] XOR A[i]; A[i] :=A[N-i +1] XOR A[i]; end;Trên đây chỉ là cài đặt cơ bản của thuật tóan trên, nó sẽ chạy chậm trong PASCAL nếu chỉ dẫn $R được bật lên, nếu thế thì bạn nên dùng con trỏ để truy xuất từng phần tử của mảng sẽ chạy nhanh hơn nhiều do tránh được việc kiểm tra chỉ số mảng của PASCAL.
Giả sử mảng A chứa các phần tử kiểu integer.
Var P,Q:^integer; P:=@A[1]; Q:=@A[k]; For i:=1 to K div 2 do begin P^:=P^ XOR Q^; Q^:=P^ XOR Q^; P^:=P^ XOR Q^; inc(P); dec(Q); end; P:=@A[K+1]; Q:=@A[N]; For i:=1 to (N-K) div 2 do begin P^:=P^ XOR Q^; Q^:=P^ XOR Q^; P^:=P^ XOR Q^; inc(P); dec(Q); end; P:=@A[1]; Q:=@A[N]; For i:=1 to N div 2 do begin P^:=P^ XOR Q^; Q^:=P^ XOR Q^; P^:=P^ XOR Q^; inc(P); dec(Q); end;
Nguồn: diendantinhoc
<div align="center"><img src="http://img221.images...4795706ld2.jpg" border="0" class="linked-image" /><br />
<!--fonto:Verdana--><span style="font-family:Verdana"><!--/fonto--><a href="http://diendantoanho...0&#entry168717" target="_blank">Hướng dẫn gõ công thức toán lên diễn đàn cho người mới</a><!--fontc--></span><!--/fontc--></div>
<br /><div align="center"><!--fonto:Verdana--><span style="font-family:Verdana"><!--/fonto--><a href="http://diendantoanho...howtopic=38505" target="_blank">Cách gõ công thức toán mới</a><br /><a href="http://diendantoanho...id=1&Itemid=18" target="_blank"><!--coloro:#008000--><span style="color:#008000"><!--/coloro--><b>Bạn có muốn gửi bài viết của mình lên trang chủ không?</b><!--colorc--></span><!--/colorc--></a><!--fontc--></span><!--/fontc--></div><br /><div align="center"><!--fonto:Courier New--><span style="font-family:Courier New"><!--/fonto--><!--sizeo:2--><span style="font-size:10pt;line-height:100%"><!--/sizeo-->em=Console.ReadLine();Console.Write("Anh yêu {0}",em);<!--sizec--></span><!--/sizec--><!--fontc--></span><!--/fontc--></div>0 người đang xem chủ đề
0 thành viên, 0 khách, 0 thành viên ẩn danh