Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 12 kết quả

Đề tài: Giải thuật Bài toán Hệ Khóa chạy?

  1. #1
    Ngày gia nhập
    04 2010
    Nơi ở
    #include<>
    Bài viết
    43

    Mặc định Giải thuật Bài toán Hệ Khóa chạy?

    hi ! chào cả nhà.
    Hôm này mình có bài toán như thế này. không biết có phải động chạm đến bảng mã không nhỉ
    Với bảng chữ cái từ A-Z, tương ứng từ 0-25

    Ta có bài toán thế này
    Cho key: deceptive
    Plaintext: wearediscoveredsaveyourself


    ví dụ như cột đầu tiên : d+w tương ứng với 3+22=25 nên ta được Z

    Cứ tiếp tục như thế Ta nhận được bản mã tương ứng là:
    ZICVTWQNGKZEIIGASXSTSLVVWLA

    đầu vào gồm 2 dòng, dòng đầu là key, dòng 2 là plaintext
    Đầu ra là kết quả



    Demo :
    Input.inp
    deceptive
    wearediscoveredsaveyourself
    Output.out
    ZICVTWQNGKZEIIGASXSTSLVVWLA


    Bạn nào có code luôn thì hay quá. Mình đang cần giải thuật này. cảm ơn các bạn nhiều
    CỐ LÊN CHÚT NỮA , ĐÓ SẼ LÀ THIÊN ĐƯỜNG

  2. #2
    Ngày gia nhập
    03 2011
    Bài viết
    44

    Mặc định Gởi bạn đoạn code tham khảo!

    C++ Code:
    1. #include "iostream"
    2. #include "cstring"
    3. using namespace std;
    4.  
    5. int f(char c)
    6. {
    7.     if(c=='a')return 0;
    8.     else return ( c - 'a');
    9. }
    10. char f1(int a)
    11. {
    12.      char tam = 'A';
    13.      if(a==0)return tam;
    14.      else return (char)(65 + a);
    15. }
    16. int main()
    17. {    
    18.     string input, plantext;
    19.     cin>>input; cin>>plantext;
    20.     int n1 = input.size(); int n2 = plantext.size();
    21.  
    22.     for(int i=n1;i<n2;i++)input+=plantext[i - n1];
    23.  
    24.  
    25.     cout<<"Ket qua: "<<endl;
    26.     for(int i=0;i<n2;i++)    
    27.     {
    28.          int tam = f(input[i]) + f(plantext[i] );
    29.          if(tam > 25) tam -= 26;
    30.          cout<<f1(tam);        
    31.     }
    32.    
    33.     cout<<endl;
    34.  
    35.     system("pause");
    36.     return 0;
    37. }
    Chúc may mắn.

  3. #3
    Ngày gia nhập
    04 2010
    Nơi ở
    #include<>
    Bài viết
    43

    cảm ơn bạn ! Bài này đọc từ file hay sao hả bạn. Bạn có thể nói rõ giải thuật được không.
    . hihi. làm phiền bạn tý nhé
    CỐ LÊN CHÚT NỮA , ĐÓ SẼ LÀ THIÊN ĐƯỜNG

  4. #4
    Ngày gia nhập
    03 2011
    Bài viết
    44

    Mặc định Chào bạn,

    Mình dùng devC để làm. Làm trực tiếp, không có đọc file.
    Còn về giải thuật: Chẳng qua là mình chuyển ký tự thành số, và số thành kí tự.

  5. #5
    Ngày gia nhập
    01 2012
    Nơi ở
    localhost
    Bài viết
    140

    1. Chuyển 1 ký tự về thành số từ 0 -> 25: biến ký tự đó về thành dạng ký tự in hoa, rồi lấy ký tự in hoa đó trừ cho 'A'
    2. Chuyển ngược 1 số từ 0 -> 25 về thành ký tự: cộng số đó với ký tự 'A'
    3. Khóa có 2 vùng: vùng khóa + vùng plaintext nối thêm => chia ra 2 vòng lặp for với 2 công thức khác nhau để tính cho một ký tự đầu ra (ciphertext):
      C++ Code:
      1. for (int i = 0; i < length_of_key; i++)
      2. {
      3.     ciphercode = (((toupper(key[i]) - 'A') + (toupper(plaintext[i]) - 'A')) % 26) + 'A';
      4.     // in biến ciphercode ra file;
      5. }
      6.  
      7. for (int i = length_of_key; i < length_of_plaintext; i++)
      8. {
      9.     ciphercode = (((toupper(plaintext[i - length_of_key]) - 'A') + (toupper(plaintext[i]) -'A')) % 26) + 'A';
      10.     // in biến ciphercode ra file;
      11. }

    Code them khảo :
    C++ Code:
    1. #include <fstream>
    2. #include <cctype>
    3. #include <string>
    4. using namespace std;
    5. #define MAX 1000
    6.  
    7. int main()
    8. {
    9.     char *key;
    10.     char *plaintext;
    11.     key = new char[MAX];
    12.     plaintext = new char[MAX];
    13.  
    14.     ifstream f_in("Input.inp");
    15.     f_in >> key >> plaintext;
    16.    
    17.     ofstream f_out("Output.out");
    18.  
    19.     int length_of_key = strlen(key);
    20.     int length_of_plaintext = strlen(plaintext);
    21.     int ciphercode;
    22.  
    23.     for (int i = 0; i < length_of_key; i++)
    24.     {
    25.         ciphercode = (((toupper(key[i]) - 'A') + (toupper(plaintext[i]) - 'A')) % 26) + 'A';
    26.         f_out << (char)ciphercode;
    27.     }
    28.  
    29.     for (int i = length_of_key; i < length_of_plaintext; i++)
    30.     {
    31.         ciphercode = (((toupper(plaintext[i - length_of_key]) - 'A') + (toupper(plaintext[i]) -'A')) % 26) + 'A';
    32.         f_out << (char)ciphercode;
    33.     }
    34.  
    35.     delete[] key;
    36.     delete[] plaintext;
    37.     return 0;
    38. }
    Rẹt rẹt..

  6. #6
    Ngày gia nhập
    04 2010
    Nơi ở
    #include<>
    Bài viết
    43

    Mặc định Giải thuật Bài toán Hệ Khóa chạy?

    tuyệt lắm sim. giải thuật rõ ràng. dễ hiểu. cảm ơn sim nhiều
    CỐ LÊN CHÚT NỮA , ĐÓ SẼ LÀ THIÊN ĐƯỜNG

  7. #7
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    Giải thuật của phuchaontu cộng hai chuỗi ấy lại nên chỉ cần chạy 1 vòng lặp?

  8. #8
    Ngày gia nhập
    03 2011
    Bài viết
    44

    Mặc định Chào bạn,

    Trích dẫn Nguyên bản được gửi bởi VoTichSu Xem bài viết
    Giải thuật của phuchaontu cộng hai chuỗi ấy lại nên chỉ cần chạy 1 vòng lặp?
    Bài này mình cũng viết bởi 2 vòng for mà, vòng for đầu tiên là cộng chuỗi, vòng for 2 là xuất kết quả.
    Chúc may mắn.

  9. #9
    Ngày gia nhập
    04 2010
    Bài viết
    1,534

    Ai lại chẳng biết đụng đến chuỗi thì phải có vòng lặp.

    Ở đây chỉ nói chuyện giải thuật. Bình thường nếu cộng chuỗi thì người ta dùng hàm strcat (tuy rằng hàm này cũng dùng vòng lặp)

  10. #10
    Ngày gia nhập
    12 2010
    Bài viết
    129

    các bạn ơi. cho mình hỏi. Code bài này chạy đúng chưa nhỉ ?

    bài của chủ thớt. Phía key có số kí tự ít hơn plaintext. THì phía sau phải bổ sung plaintext vào cho chiều dài bằng key mà .
    Ai test code chưa, cho mình ý kiến với
    Hỏi một câu thì chỉ dốt trong chốc lát.
    Nhưng nếu không hỏi thì bạn sẽ dốt suốt đời.

    ƯỚC MƠ VẪN CHỈ LÀ ƯỚC MƠ NẾU CHỈ BIẾT ƯỚC MƠ MÀ KHÔNG CÓ SỰ NỖ LỰC

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

  1. chạy bằng tay bằng giải thuật đệ qui
    Gửi bởi dothanhlap trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 10
    Bài viết cuối: 02-01-2013, 09:56 PM
  2. Hiện thực hoá giải thuật Roundrobin với C++ ! hàm calc chạy chưa đúng! sửa giúp mình.
    Gửi bởi code_c trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 0
    Bài viết cuối: 26-11-2011, 12:32 AM
  3. Chương trình chấm thi cho các kì thi giải thuật là chương trình gì? Hoạt động thế nào?
    Gửi bởi coolkg1412 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 6
    Bài viết cuối: 11-10-2011, 10:17 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