01/10/2018, 00:50

Nhờ chuyển yêu cầu sau thành chương trình

Em đang làm bài báo cáo toán muốn nhờ mọi người chuyển yêu cầu sau thành 1 chương trình
Thuật toán sinh ra các hoán vị gồm các bước:
B1:[Khởi tạo chuỗi] Đặt si=i(với i=1,2………n).
B2:[Xuất hoán vị đầu tiên]Xuất choỗi s=s1s2….sn.
B3:[Lặp]với mỗi i=2,3……,n!thực hiện các bước sau:
3.1:Tìm chỉ số lớn nhất thỏa mãn sm<sm+1
3.2:Tìm chỉ số lớn nhất k thỏa mãn sk>sm
3.3:Hoán vị hai phần tử sm và sk
3.4:Đảo ngược thứu tự của các phần tử sm+1,….sn.
3.5:Xuất s.

Mình muốn nhờ mọi người code trên càng nhiều ngôn ngữ càng tốt(Pascal,C#,C,C++…).Mình muốn chứng minh rằng toán rời rạc có thể áp dụng vào tin học rất nhiều.

Cảm ơn mọi người rất nhiều

Người bí ẩn viết 03:05 ngày 01/10/2018

Mình muốn nhờ mọi người code trên càng nhiều ngôn ngữ càng tốt(Pascal,C#,C,C++…)

Có gì đó sai sai

Nguyễn Văn Vương viết 02:56 ngày 01/10/2018

sai dư lào bạn,mình chưa hiểu ý bạn lắm???

Minh Hoàng viết 03:04 ngày 01/10/2018

Bạn code được ngôn ngữ nào rồi thì quăng lên đây. Mọi người sẽ chuyển qua ngôn ngữ khác cho bạn. Nếu chưa code được bạn có thể học python hoặc C/C++ trước.

chichi viết 03:03 ngày 01/10/2018

Nếu bạn làm báo cáo hãy thử search permutation generator algorithm + tên ngôn ngữ.
Good luck

Nguyễn Văn Vương viết 03:03 ngày 01/10/2018

Cảm ơn bạn,một cách hay

viết 03:00 ngày 01/10/2018

C++11: http://rextester.com/VOSM33438

#include <iostream>
#include <vector>
#include <algorithm>

int main()
{
    int n; std::cin >> n;
    
    //B1:[Khởi tạo chuỗi] Đặt si=i(với i=1,2……..n).
    std::vector<int> s(n);
    std::iota(begin(s), end(s), 1);
    //B2:[Xuất hoán vị đầu tiên]Xuất chuỗi s=s1s2….sn.
    for (int n : s) std::cout << n << " "; std::cout << "\n";
    //B3:[Lặp]với mỗi i=2,3…..,n!thực hiện các bước sau:
    for (int m, k;;)
    {
        //3.1:Tìm chỉ số lớn nhất thỏa mãn sm<sm+1
        for (m = n-1; m-- && s[m] >= s[m+1]; );
        if (m < 0) break; //ko tìm được nghĩa là ta đã ở hoán vị cuối cùng, thoát
        //3.2:Tìm chỉ số lớn nhất k thỏa mãn sk>sm
        for (k = n; k-- && s[k] <= s[m]; );
        //3.3:Hoán vị hai phần tử sm và sk
        std::swap(s[m], s[k]);
        //3.4:Đảo ngược thứu tự của các phần tử sm+1,….sn.
        std::reverse(begin(s)+m+1, end(s));
        //3.5:Xuất s.
        for (int n : s) std::cout << n << " "; std::cout << "\n";
    }
}

mỗi bước 1 dòng thôi

Nguyễn Văn Vương viết 03:05 ngày 01/10/2018

Cảm ơn bạn nhé
Chúc sức khỏe

Nguyễn Văn Vương viết 03:04 ngày 01/10/2018

iota là sao bạn nhỉ,có gì sai sao???
> Error 1 error C2039: 'iota' : is not a member of 'std' c:\users\administrator\documents\visual studio 2013\projects\1510289_lab08\test-sinh hoan vi\test-sinh hoan vi\source.cpp 11 1 Test-Sinh Hoan Vi

viết 03:05 ngày 01/10/2018

vậy thêm #include <numeric> vô nữa

Nguyễn Văn Vương viết 02:52 ngày 01/10/2018

hoàn hảo cảm ơn bạn rất nhiều

Nguyễn Văn Vương viết 02:54 ngày 01/10/2018

Xin phiền bạn chút xíu:
vòng lặp này là sao bạn nhỉ
for (int n : s)
Mình mới chỉ biết vòng lặp for cơ bản,nhìn cái này chưa hiểu lắm mong bạn chỉ bảo cho :))

viết 02:54 ngày 01/10/2018

nó gọi là “range-based for loop” có trong C++11, để viết tắt cách lướt lần lượt tất cả các phần tử trong 1 container.

vd với sstd::vector (mảng động) thì thay vì viết

for (size_t i = 0; i < s.size(); ++i)
{
    int n = s[i];
    //xử lý n
}

thì với range-based for loop bạn chỉ cần viết

for (int n : s)
{
    //xử lý n
}

đơn giản hơn, lại vừa dễ hiểu hơn cái i = 0; i < ; i++ kia.int n : s hiểu là int n trong s.

Nguyễn Văn Vương viết 02:51 ngày 01/10/2018

Ra z cảm ơn bạn nhiều nhé

Bài liên quan
0