Công cụ bảo vệ mã nguồn .NET mạnh nhất, không thể unpack, miễn phí cho các khách hàng đầu tiên đăng ký.
Từ 1 tới 7 trên tổng số 7 kết quả

Đề tài: một bài tập về quay lui mong các bạn code cho

  1. #1
    Ngày gia nhập
    04 2020
    Bài viết
    0

    Mặc định một bài tập về quay lui mong các bạn code cho

    BÀI 19. DÃY SỐ 1 Cho dãy số A[] gồm n số nguyên dương. Tam giác đặc biệt của dãy số A[] là tam giác được tạo ra bởi n hàng, trong đó hàng thứ 1 là dãy số A[], hàng i là tổng hai phần tử liên tiếp của hàng i-1 (2≤i≤n). Ví dụ A[] = {1, 2, 3, 4, 5}, khi đó tam giác được tạo nên như dưới đây:
    [1, 2, 3, 4, 5 ]
    [3, 5,7,9]
    [8,12,16]
    [20,28]
    [48]
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

  2. #2
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    919

    Trích dẫn Nguyên bản được gửi bởi math_tech Xem bài viết
    BÀI 19. DÃY SỐ 1 Cho dãy số A[] gồm n số nguyên dương. Tam giác đặc biệt của dãy số A[] là tam giác được tạo ra bởi n hàng, trong đó hàng thứ 1 là dãy số A[], hàng i là tổng hai phần tử liên tiếp của hàng i-1 (2≤i≤n). Ví dụ A[] = {1, 2, 3, 4, 5}, khi đó tam giác được tạo nên như dưới đây:
    [1, 2, 3, 4, 5 ]
    [3, 5,7,9]
    [8,12,16]
    [20,28]
    [48]
    Bài này thì đi tới chứ không quay lui đâu bạn
    C++ Code:
    1. #include <iostream>
    2. #include <time.h>
    3. using namespace std;
    4.  
    5. int * CreateArray(int & cCount)             // Nơi gọi nhớ delete nếu không NULL
    6. {
    7.     srand((unsigned int)time(0));
    8.     cCount = rand() % 8 + 2;                // Khoảng [2,9]
    9.     int * pArray = 0;                       // Đề phòng cấp phát nhảy ngoại lệ
    10.     pArray = new int[cCount];               // Cấp phát động
    11.     if (pArray)
    12.     {
    13.         for (int i = 0; i < cCount; i++)
    14.             pArray[i] = rand() % 20;        // Khoảng [0,19]
    15.     }
    16.     return pArray;
    17. }
    18. void DisplayArray(int * pArray, int cCount)
    19. {
    20.     for (int i = 0; i < cCount; i++)
    21.     {
    22.         cout.width(3);
    23.         cout << pArray[i] << ((i < cCount - 1) ? "," : " };\n");
    24.     }
    25. }
    26. void DisplayResult(int * pArray, int iRow, int cCount)
    27. {
    28.     cout << " #"; cout.width(2); cout << iRow + 1; cout << ": [";
    29.     // Hiển thị
    30.     for (int i = 0; i < cCount; i++)
    31.     {
    32.         cout.width(4);
    33.         cout << pArray[i] << ((i < cCount - 1) ? "," : " ]\n");
    34.     }
    35.     if (0 == cCount - 1)
    36.         return;
    37.     // Tạo mảng kế tiếp
    38.     int *   pNext = 0;
    39.     pNext = new int[cCount - 1];
    40.     if (pNext)
    41.     {
    42.         for (int i = 0; i < cCount - 1; i++)
    43.             pNext[i] = pArray[i] + pArray[i + 1];
    44.         DisplayResult(pNext, iRow + 1, cCount - 1);     // Đệ quy
    45.         delete[] pNext;
    46.     }
    47. }
    48. int main()
    49. {
    50.     int *   pArray;                         // Con trỏ mảng
    51.     int     cCount;                         // Số phần tử
    52.    
    53.     pArray = CreateArray(cCount);
    54.     if (pArray)
    55.     {
    56.         cout << "\n CreatedArray: A[" << cCount << "] = {";
    57.         DisplayArray(pArray, cCount);
    58.         cout << " DisplayResult:\n";
    59.         DisplayResult(pArray, 0, cCount);
    60.         cout << "\n ";
    61.         delete[] pArray;
    62.     }
    63.     system("pause");
    64.     return 0;
    65. }
    Attached Thumbnails Attached Thumbnails BAITAP.jpg  
    Đã được chỉnh sửa lần cuối bởi MHoang : 27-04-2020 lúc 12:53 PM.

  3. #3
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    483

    Cách trên của MHoang khá tốn bộ nhớ
    Ta có thể dùng 1 mảng duy nhất để tính toán "int* pArray=new int[n];"
    Đầu tiên hiển thị mảng, sau đó tính mảng mới và lưu ngay trên mảng cũ theo thứ tự từ phải sang trái bắt đầu từ phần tử thứ cCount-1
    sau đó hiển thị rồi quay lại tính mảng mới...

  4. #4
    Ngày gia nhập
    02 2014
    Nơi ở
    TP.HCM
    Bài viết
    919

    Trích dẫn Nguyên bản được gửi bởi khoaph Xem bài viết
    Cách trên của MHoang khá tốn bộ nhớ
    Ta có thể dùng 1 mảng duy nhất để tính toán "int* pArray=new int[n];"
    Đầu tiên hiển thị mảng, sau đó tính mảng mới và lưu ngay trên mảng cũ theo thứ tự từ phải sang trái bắt đầu từ phần tử thứ cCount-1
    sau đó hiển thị rồi quay lại tính mảng mới...
    OK bạn, đã nhìn ra lãng phí bộ nhớ, thay đổi như sau, nhưng đi từ trái sang phải
    C++ Code:
    1. void DisplayResult(int * pArray, int iRow, int cCount)
    2. {
    3.     cout << " #"; cout.width(2); cout << iRow + 1; cout << ": [";
    4.     // Hiển thị
    5.     for (int i = 0; i < cCount; i++)
    6.     {
    7.         cout.width(4);
    8.         cout << pArray[i] << ((i < cCount - 1) ? "," : " ]\n");
    9.     }
    10.     if (0 == cCount - 1)
    11.         return;
    12.     // Tạo mảng kế tiếp - Mã cũ
    13.     /*
    14.     int *   pNext = 0;
    15.     pNext = new int[cCount - 1];
    16.     if (pNext)
    17.     {
    18.         for (int i = 0; i < cCount - 1; i++)
    19.             pNext[i] = pArray[i] + pArray[i + 1];
    20.         DisplayResult(pNext, iRow + 1, cCount - 1);     // Đệ quy
    21.         delete[] pNext;
    22.     }
    23.     */
    24.     // Rút gọn mảng - Mã mới
    25.     for (int i = 0; i < cCount - 1; i++)
    26.         pArray[i] += pArray[i + 1];
    27.     DisplayResult(pArray, iRow + 1, cCount - 1);        // Đệ quy
    28. }

  5. #5
    Ngày gia nhập
    12 2015
    Nơi ở
    Đà Nẵng
    Bài viết
    483

    Trích dẫn Nguyên bản được gửi bởi MHoang Xem bài viết
    OK bạn, đã nhìn ra lãng phí bộ nhớ, thay đổi như sau, nhưng đi từ trái sang phải
    C++ Code:
    1. void DisplayResult(int * pArray, int iRow, int cCount)
    2. {
    3.     cout << " #"; cout.width(2); cout << iRow + 1; cout << ": [";
    4.     // Hiển thị
    5.     for (int i = 0; i < cCount; i++)
    6.     {
    7.         cout.width(4);
    8.         cout << pArray[i] << ((i < cCount - 1) ? "," : " ]\n");
    9.     }
    10.     if (0 == cCount - 1)
    11.         return;
    12.     // Tạo mảng kế tiếp - Mã cũ
    13.     /*
    14.     int *   pNext = 0;
    15.     pNext = new int[cCount - 1];
    16.     if (pNext)
    17.     {
    18.         for (int i = 0; i < cCount - 1; i++)
    19.             pNext[i] = pArray[i] + pArray[i + 1];
    20.         DisplayResult(pNext, iRow + 1, cCount - 1);     // Đệ quy
    21.         delete[] pNext;
    22.     }
    23.     */
    24.     // Rút gọn mảng - Mã mới
    25.     for (int i = 0; i < cCount - 1; i++)
    26.         pArray[i] += pArray[i + 1];
    27.     DisplayResult(pArray, iRow + 1, cCount - 1);        // Đệ quy
    28. }
    Đúng rồi, như thế cũng được!

  6. #6
    Ngày gia nhập
    04 2020
    Bài viết
    0

    Mặc định một bài tập về quay lui mong các bạn code cho

    cảm ơn bạn nhiều

    - - - Nội dung đã được cập nhật ngày 28-04-2020 lúc 08:55 PM - - -

    cảm ơn bạn đã quan tâm

  7. #7
    Ngày gia nhập
    02 2016
    Bài viết
    306

    1. đệ quy quay lui xảy ra khi in tam giác với đỉnh nằm trên, đáy nằm dưới.

    2. tại sao phải print riêng và tính riêng vậy? chung một lần cũng được mà.

    if (aLast < 0) return; // aLast is the index of the last usable item
    printf("[ %d", A[0]);
    for (i=1; i <= aLast; i++)
    {
    printf(", %d", A[i]);
    A[i-1] += A[i];
    }
    printf(" ]\n");
    DeQuy(A, --aLast);
    Công cụ bảo vệ mã nguồn .NET mạnh nhất hiện tại, miễn phí cho các khách hàng đầu tiên đăng ký.

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