Trang 5 trên tổng số 5 Đầu tiênĐầu tiên ... 345
Từ 41 tới 47 trên tổng số 47 kết quả

Đề tài: Tìm số lớn nhất tạo ra từ các chữ số của 2 số đã cho

  1. #41
    Ngày gia nhập
    01 2010
    Bài viết
    306

    Mặc định Tìm số lớn nhất tạo ra từ các chữ số của 2 số đã cho

    Trích dẫn Nguyên bản được gửi bởi langman Xem bài viết
    hơi dài,
    dùng hằng chuỗi global thường ko được điểm cao đâu

    hàm main và toàn bộ chương trình có cấu trúc phức tạp, mang nặng tính vấn đề, langman đề xuất bạn hãy đưa ra những bài có hàm main rõ ràng và đơn giản. Ta sử dụng đệ quy nhắm làm cho chương trình trong sáng, ngắn gọn, dễ hiểu.

    de_quy(0,0,0); << lời gọi đệ quy như này ko hay, các con số vô nghĩa quá.

    ==>> ko chấp nhận



    Mình mới học đệ quy thôi, nên yêu cầu hơi khắt khe, nếu có gì sai sót hoặc ko đúng mong được bạn góp ý thẳng thắn, tớ xin hứa sẽ sửa ngay
    Hic, kiếm được 1 lời gọi đệ qui đẹp, hay, ý nghĩa thật sự rất khó. Không hẳn cái gì mang đệ qui cũng có được 1 lời gọi hàm hay 1 code bên trong đẹp, gọn gàng và dễ hiểu đâu. Để hiểu/dùng được đệ qui bắt buộc người ta phải trang bị 1 tư duy mới: thử, sai, và quay lui. Từ kiểu tư duy cơ bản( lặp, rẽ nhánh ) muốn chuyển sang tư duy theo đệ qui cũng đã là 1 vấn đề. Nó giống như khi ta học hình học 2 chiều chuyển qua hình học không gian vậy. Cách nhìn trên 2 vấn đề hoàn toàn khác
    1 bài toán chỉ nên đệ qui khi bản chất của nó là đệ qui /hoặc khi đệ qui là cách giải quyết tốt nhất. Chứ như bài này đi giải theo đệ qui thì .. >"<
    Để sửa lại 1 chút ....
    C++ Code:
    1. #include <iostream>
    2. #include <conio.h>
    3.  
    4. using namespace std;
    5.  
    6. char* a = "2635";
    7. char* b = "3521";
    8. char* c = new char[100];
    9. char* tot_nhat = new char [100];
    10.  
    11. int len_a, len_b, len;
    12.  
    13. void ghi_nhan_ket_qua()
    14. {
    15.     int i;
    16.     for(i=0; i<len; i++)
    17.         if(tot_nhat[i]>c[i]) return;
    18.         else if(tot_nhat[i]<c[i]) break;
    19.  
    20.     if(i<len)
    21.         for(i=0; i<len; i++) tot_nhat[i] = c[i];
    22. }
    23.  
    24. void ghep_chuoi(int i, int j)
    25. {
    26.     if(i+j==len)
    27.     {
    28.         ghi_nhan_ket_qua();
    29.         return;
    30.     }
    31.    
    32.     if(i<len_a)
    33.     {
    34.         c[i+j] = a[i];
    35.         ghep_chuoi(i+1, j);
    36.     }
    37.     if(j<len_b)
    38.     {
    39.         c[i+j] = b[j];
    40.         ghep_chuoi(i, j+1);
    41.     }
    42. }
    43.  
    44. void khoi_tao()
    45. {
    46.     len_a = strlen(a);
    47.     len_b = strlen(b);
    48.     len = len_a + len_b;
    49.     for(int i =0; i<len; i++) tot_nhat[i] = '0';
    50.     tot_nhat[len] = '\0';
    51. }
    52.  
    53. void hoan_tat()
    54. {
    55.     cout<<"Ket qua la: "<<tot_nhat;
    56.     delete[] c;
    57.     delete[] tot_nhat;
    58.     getch();
    59. }
    60.  
    61. void main()
    62. {
    63.     khoi_tao();
    64.     ghep_chuoi(0,0);
    65.     hoan_tat();
    66. }
    Đã đưa thêm các hàm phụ để hàm main đơn giản 1 chút
    Còn về phần đệ qui thì tớ đã bỏ biến k, vì biến này là tính được theo 2 biến đầu : k = i + j

    Hàm ghep_chuoi tớ xây dựng ở đây theo quan điểm rằng tớ ko có bất kì 1 ý tưởng nào khả dĩ để giải quyết bài này, cho nên phải dùng đệ qui, vét cạn toàn bộ để tìm ra phương án tối ưu

    ghep_chuoi(i,j) : Nghĩa là yêu cầu ghép 2 chuỗi a, b, bắt đâu tại vị trí i đối với chuỗi a, và tại j đối với chuỗi b, kết quả đưa ra chuỗi c( bắt đầu tại c[i+j])
    Lời gọi hàm đương nhiên sẽ là ghep_chuoi(0, 0) : Ghép 2 chuỗi a, b từ vị trí đầu tiên
    Đệ qui sẽ kết thúc khi ta đã dùng hết các phần tử của a,b tức là khi ghep_chuoi(leng_a, leng_b) được gọi. Khi đó ta tiến hành đánh giá ghi nhận kết quả
    Để ghep_chuoi(i,j) thì
    + Hoặc là lấy phần tử tiếp theo thuộc chuỗi a : a[i] đặt vào kết quả, và gọi đệ quy ghep_chuoi(i+1,j)
    + Hoặc là lấy phần tử tiếp theo thuộc chuỗi b : b[j] đặt vào kết quả, và gọi đệ quy ghep_chuoi(i,j+1)
    Cá nhân tớ thấy lời gọi ghep_chuoi này ko có gì quá phức tạp cả

    Còn đây là hàm ghep_chuoi khi ta giả định rằng đã giải quyết được các trường hợp a[i]>b[j] hay a[i]<b[j], chì còn nghi vấn tại a[i]==b[j]
    C++ Code:
    1. void ghep_chuoi(int i, int j)
    2. {
    3.     if(i+j==len)
    4.     {
    5.         ghi_nhan_ket_qua();
    6.         return;
    7.     }
    8.    
    9.     if(a[i]>b[j])
    10.     {
    11.         c[i+j] = a[i];
    12.         ghep_chuoi(i+1, j);
    13.     }
    14.     else
    15.         if(a[i]<b[j])
    16.         {
    17.             c[i+j] = b[j];
    18.             ghep_chuoi(i, j+1);
    19.         }
    20.         else
    21.         {
    22.             c[i+j] = a[i];
    23.             ghep_chuoi(i+1, j);
    24.             c[i+j] = b[j];
    25.             ghep_chuoi(i, j+1);
    26.         }
    27. }

    Còn như ko muốn dùng biến toàn cục phải thêm a, b, c vào tham số hàm đệ qui chứ biết sao hơn ...
    Đã được chỉnh sửa lần cuối bởi Sounj : 11-08-2010 lúc 08:30 AM.

  2. #42
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,007

    @Sounj : cám ơn bạn rất nhiều, mình mới học đệ quy thôi, cũng là do cảm nhận cá nhân nên mình mới dám góp ý bạn thế. bạn đừng giận nha. Còn đây là code đệ quy của langman. sai ở đâu thì mong được mọi người chỉ dẫn và góp ý luôn

    PHP Code:
    #include <iostream>
    using namespace std;
    void tron(char *a,char *b,char *c)
    {
        if (*
    a||*b
        {
            *
    c++=strcmp(a,b)>0?*a++:*b++;
            
    tron(a,b,c);
        }
        else *
    c=0;
    }
    int main()
    {
        
    char an[20],bn[20],cn[20];
        
    int a=49715,b=2941;
        
    itoa(a,an,10);
        
    itoa(b,bn,10);
        
    tron(an,bn,cn);
        
    printf("%s",cn);
        
    system("pause");

    ^_,^

    Facebook : https://www.facebook.com/langmaninternet

    Bùi Tấn Quang

  3. #43
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,007

    chắc là mình lại nói gì sai rồi, nên ko ai nói gì nữa cả
    ^_,^

    Facebook : https://www.facebook.com/langmaninternet

    Bùi Tấn Quang

  4. #44
    Ngày gia nhập
    09 2009
    Nơi ở
    Hoa sơn tuyệt đỉnh
    Bài viết
    407

    hì, chắc là mọi người đều làm được hít rồi, đề nghị langman làm bài khác cho anh em tham khảo

    my houses
    my school
    tỐnG lÊ cHâN mAnG kỶ nIệM bUồN cHo AnH...

  5. #45
    Ngày gia nhập
    06 2007
    Nơi ở
    C:\WINDOWS\system32\dllcache\
    Bài viết
    3,007

    hunterphu thứ đá bài này cậu ơi

    http://forums.congdongcviet.com/showthread.php?t=35067

    bài tập của đội cậu mà
    share cách làm cho các bạn khác chưa biết học hỏi
    ^_,^

    Facebook : https://www.facebook.com/langmaninternet

    Bùi Tấn Quang

  6. #46
    Ngày gia nhập
    07 2010
    Bài viết
    288

    Mặc định Tìm số lớn nhất tạo ra từ các chữ số của 2 số đã cho

    char an[20],bn[20],cn[20];
    int a=291,b=2941;
    itoa(a,an,10);
    itoa(b,bn,10);
    chỗ này
    if (strcmp(a,b)>0)->kết quả là -1
    rõ ràng ở đây a=2,b=2, hàm strcmp tiếp tục so sánh phần tử tiếp theo đến khi nào nó gặp lớn hơn hay bé hơn hoặc hết thì nó hết so sánh.

    làm mình tưởng lầm hàm này so sánh 2 ký tự a[0] và b[0] rồi thôi.
    các bạn ai nếu đọc chỗ này nên chú ý nha. đừng để lầm như mình.
    Đã được chỉnh sửa lần cuối bởi AlexBlack : 12-08-2010 lúc 03:55 PM.

  7. #47
    Ngày gia nhập
    11 2015
    Nơi ở
    Quận thủ đức, tp hồ chí minh
    Bài viết
    9

    Trích dẫn Nguyên bản được gửi bởi AlexBlack Xem bài viết
    char an[20],bn[20],cn[20];
    int a=291,b=2941;
    itoa(a,an,10);
    itoa(b,bn,10);
    chỗ này
    if (strcmp(a,b)>0)->kết quả là -1
    rõ ràng ở đây a=2,b=2, hàm strcmp tiếp tục so sánh phần tử tiếp theo đến khi nào nó gặp lớn hơn hay bé hơn hoặc hết thì nó hết so sánh.

    làm mình tưởng lầm hàm này so sánh 2 ký tự a[0] và b[0] rồi thôi.
    các bạn ai nếu đọc chỗ này nên chú ý nha. đừng để lầm như mình.
    cách này nhanh gọn xúc tích

Trang 5 trên tổng số 5 Đầu tiênĐầu tiên ... 345

Các đề tài tương tự

  1. Sửa máy tính, cài đặt windows, phần mềm tại nhà nhanh nhất, rẻ nhất, hiệu quả nhất …
    Gửi bởi hopluccc trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 08-07-2013, 02:07 PM
  2. Trả lời: 12
    Bài viết cuối: 25-10-2012, 02:48 AM
  3. Bài tập C++ NHập mảng một chiều gồm n phần tử kết thúc nhập khi nhập một chữ cái
    Gửi bởi thienthanoze trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 15
    Bài viết cuối: 09-07-2012, 10:10 PM
  4. Bài tập C++ Viết phương trình nhập vào 1 chuỗi số.Hãy nhập vào 1 số.Đếm xem có bao nhiêu chữ số bạn vừa nhập
    Gửi bởi namtuocdn trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 5
    Bài viết cuối: 16-10-2011, 10:39 AM
  5. Bài tập C++ Nhập mảng 1 chiều, nếu phần tử nhập trùng nhau thì bắt nhập lại
    Gửi bởi danielh trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 09-07-2011, 03:35 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn