Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 5 của 5
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Dãy số Morse vô hạn

    Mình có 1 bài tập về Dãy Morse vô hạn M = {x0, x1, …., xn,…} chỉ với 0 và 1 được xác định như sau

    Ban đầu M<sub>0</sub> = {x0} = {0}

    Ở mỗi bước tiếp theo M<sub>n</sub> = M<sub>n-1</sub> và đảo của M<sub>n-1</sub> ( đổi 0 thành 1, 1 thành 0)

    Chẳng hạn:

    n = 0 M<sub>0</sub> = {x0} = {0}

    n = 1 M<sub>1</sub> = {x0, x1} = {0, 1}

    n = 2 M<sub>2</sub> = {x0, x1, x2, x3} = {0, 1, 1, 0}

    n = 3 M<sub>3</sub> = {x0, x1, x2, x3, x4, x5, x6, x7} = {0, 1, 1, 0, 1, 0, 0, 1}

    n = 4 M<sub>4 </sub>= {x0,x1,x2,x3,....,x14,x15} = {0, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 0}


    Viết chương trình xác định giá trị của xk trong dãy Morse

    Chẳng hạn:

    k = 0 x<sub>k</sub> = 0

    k = 7 x<sub>k</sub> = 1


    Theo mình hiểu thì thế này

    cho k: -> Tìm n để 2<sup>n</sup> ≤ k ≤ 2<sup>n+1</sup>
    Ta có r = K - 2<sup>n</sup>
    => x<sub>k</sub> = ¯(x<sub>r </sub>) (Nghịch đảo của x<sub>r</sub> )
    Mình cũng có hỏi người khác thì thấy có nói bài này là đệ quy nhưng vẫn không biết viết code ra như thế nào cả. Ai hiểu cái này thì giúp mình với

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Tính even bit parity của n ấy.

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    #include <iostream>
    #include <vector>

    using namespace std;

    int main()
    {
    int k;
    cout << "Nhap so k: "<< endl;
    cin >> k;

    //do for first two array of morse(k = 0, k = 1)
    if(k == 0 || k == 1)
    {
    cout << k << endl;
    return 0;
    }

    //for k > 1

    //create very first morse list: {0,1} -- k = 1
    vector<int> firstList;
    firstList.push_back(0);
    firstList.push_back(1);

    vector<int>myList = firstList;

    //create k-morse list
    int myFirstK = k;
    do
    {
    //************************
    if(myFirstK < myList.size())
    {
    cout << myList.at(myFirstK) << endl;
    return 0;
    }
    //*************************
    vector<int> tempList = myList;

    /ow: myList: is M(n-1)
    //tempList will become inverse of M(n-1)
    //concadinate myList + tempList(After bit inversion) ---> new myList
    for(int i = 0; i < tempList.size(); ++i)
    {
    //inverse bit
    tempList.at(i) = (tempList.at(i) + 1) % 2;
    }
    for(int i = 0; i < tempList.size(); ++i)
    {
    //concadinate
    myList.push_back(tempList.at(i));
    }
    k--;
    tempList.clear();
    }
    while(k > 1);

    cout << "xk = " << myList.at(k) << endl;
    return 0;
    }
    Đây là source mình code thử, bạn chạy xem thử có đúng không? ^^
    Nếu bạn không hiểu đoạn: //****************** ... //******************
    Bạn có thể bỏ nó đi và chạy thử. sẽ hiểu ngay. Chúc vui nha.

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    ^ Không cần thiết.

  5. #5
    Trích dẫn Gửi bởi tanth90
    #include <iostream>
    #include <vector>

    using namespace std;

    int main()
    {
    int k;
    cout << "Nhap so k: "<< endl;
    cin >> k;

    //do for first two array of morse(k = 0, k = 1)
    if(k == 0 || k == 1)
    {
    cout << k << endl;
    return 0;
    }

    //for k > 1

    //create very first morse list: {0,1} -- k = 1
    vector<int> firstList;
    firstList.push_back(0);
    firstList.push_back(1);

    vector<int>myList = firstList;

    //create k-morse list
    int myFirstK = k;
    do
    {
    //************************
    if(myFirstK < myList.size())
    {
    cout << myList.at(myFirstK) << endl;
    return 0;
    }
    //*************************
    vector<int> tempList = myList;

    /ow: myList: is M(n-1)
    //tempList will become inverse of M(n-1)
    //concadinate myList + tempList(After bit inversion) ---> new myList
    for(int i = 0; i < tempList.size(); ++i)
    {
    //inverse bit
    tempList.at(i) = (tempList.at(i) + 1) % 2;
    }
    for(int i = 0; i < tempList.size(); ++i)
    {
    //concadinate
    myList.push_back(tempList.at(i));
    }
    k--;
    tempList.clear();
    }
    while(k > 1);

    cout << "xk = " << myList.at(k) << endl;
    return 0;
    }
    Đây là source mình code thử, bạn chạy xem thử có đúng không? ^^
    Nếu bạn không hiểu đoạn: //****************** ... //******************
    Bạn có thể bỏ nó đi và chạy thử. sẽ hiểu ngay. Chúc vui nha.


    Nó báo chạy được rồi bạn, nhưng nhập cả sau đó nó hiện kết quả thì cửa sổ console tự đóng luốn, hình như thiếu lệnh dừng màn hình để đọc
    Mà vì sao với k=2 thì sẽ cho ra thông báo là "xk=1" còn nhập k khác thì nó chỉ hiện thông báo là 0 hoặc 1

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •