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ố 14 kết quả

Đề tài: biểu diễn nhị phân-hơi bị chuối

  1. #1
    Ngày gia nhập
    08 2006
    Bài viết
    19

    Mặc định biểu diễn nhị phân-hơi bị chuối

    đề bài rất đơn giản: đọc vào 1 số nguyên dương, sau đó viết ra màn hình dưới dạng nhị phân tách thành từng nhóm 4 chữ số nhị phân cho dễ đọc. Nếu không tạo được nhóm 4 chữ số thì phải thêm số 0 vào đằng trước cho đủ
    VD:
    245: 1111 1110
    256: 0001 0000 0000
    65536: 0001 0000 0000 0000 0000
    Bài toán thì rất đơn giản, cái chuối là ở đây : không được dùng mảng, xâu.. tóm lại là các kiểu dữ liệu để lưu trữ dãy số đều bị cấm . Không dùng đệ quy
    Các bạn thử nêu ý kiến xem(không cần code cụ thể). Tôi thì đã làm được bài này, nhưng tôi nghĩ không hay. Mong tìm được cách khác hay hơn

  2. #2
    Ngày gia nhập
    08 2006
    Nơi ở
    Hải Phòng
    Bài viết
    218

    And số đó với 2^n để tìm ra bit thứ n trong số đó
    Mã giả như sau:
    Code:
    int i=0, j=0;
    while (so< exp(n*ln(2)))
      {
         if (++j % 4==0) printf("%d ",so && exp(n*ln(2)));
         else printf("%d ",so && exp(n*ln(2)));
         if (j % 4 !=0) 
            for (int k=1; k<= i% 4; k++) printf("%d", 0);
      }
    //Chu y: mã ở trên viết ra theo thứ tự ngược lại, có thể tính trước n để viết
    ra thứ tự đúng.

  3. #3
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Chậc cách của HaiLoc cũng khó hiểu quá . Có thể nói rõ ko nào .

  4. #4
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Kết quả của Lộc thì reverse ngược lại là được
    None!

  5. #5
    Ngày gia nhập
    08 2006
    Nơi ở
    Hải Phòng
    Bài viết
    218

    Cái exp(n*ln(2)) là để tính 2^n. Vì số 2^n chỉ có bit thứ n là 1--> khi and với 2^n nếu kết quả <>1 thì bit thứ n của số kiểm tra là 1 ngược lại nó là 0. Ta dựa vào đó để duyệt qua từng bit một của số.

  6. #6
    Ngày gia nhập
    10 2006
    Nơi ở
    In Your Bugs
    Bài viết
    823

    Mặc định biểu diễn nhị phân-hơi bị chuối

    Kid thì nghĩ thế này . Gọi số cần tính là n ,bây giờ ta tính các bit mà tại đó < log(n) rồi lần ngược về . Nếu mà 2^i lớn hơn n , thì loại ra nếu nhỏ hơn thì có được một bit cần tìm sau đó tìm bit tiếp theo đằng sau bằng cách tương tự nhưng không phải so với n mà là n- 2^i . Cách này thì đơn giản nhưng không tối ưu lắm .

    vd: 567 thì ta có 2^9 = 512 . như vậy cờ bit này là bằng 1. sau đó tìm bit tiếp theo mà 2^i <= 567 - 512 , ta sẽ có được số 5 . lúc này ta đã có dãy là 0010 0010 ???? ???? rồi cứ thế mà tìm .

  7. #7
    Ngày gia nhập
    08 2006
    Bài viết
    19

    @hailoc: không chấp nhận, bài viết quá rắc rối(có biết tại sao không cho dùng mảng.. không - đó là vì bài này được ra khi mới học xong if... else, while do. ngay cả vòng for còn chưa học tới )
    nếu để tính 2^n thì dùng hàm pow hay hơn, cách exp(x*ln(y)) chỉ dùng cho pascal thôi. dùng xử lý bit hay chia lấy dư cũng tương tự nhau(dù dùng & bit thì chạy nhanh hơn) vì bài này thời gian chạy rắt ngắn.
    1 trong mấy cái chuối là viết ra đúng thứ tự, chứ đảo ngược lại thì không hay lắm

  8. #8
    Ngày gia nhập
    09 2006
    Nơi ở
    /usr/share/.hack@
    Bài viết
    1,433

    Đã đòi bài viết hay lại còn kêu rắc rối ...Vui tính ghê..
    None!

  9. #9
    Ngày gia nhập
    08 2006
    Nơi ở
    Hải Phòng
    Bài viết
    218

    Chương trình hoàn chỉnh đây, mọi người xem thử đã đươc chưa
    PHP Code:
    #include "stdio.h"
    #include "math.h"
    #include "conio.h"
    void main()
    {
      
    int so;

      
    printf("Hay nhap vao so:"); scanf("%d", &so);

      
    int nlog(so)/ log(2);
      
    int dem 0;
      
    int i;
      if ((
    n+1) % 4)
      {
         for (
    i=1i<= 4- (n+1) % 4i++)
         {
             
    printf("%d"0);
             
    dem++;
         }
      }
      
    int j;
      for (
    i=ni>=0i--)
      {
        if (++
    dem == 0)
        {
            
    jpow(2i);
            
    printf("%d ", (so j)==0:1);
        }
        else
        {
            
    jpow(2i);
            
    printf("%d", (so j)==0:1);
        }
      }

      
    getch();



  10. #10
    Ngày gia nhập
    09 2006
    Bài viết
    711

    Trời ạ, các cậu quen lý thuyết cao siêu rồi, chỉ có đổi từ num 2 bin mà chi cho phức tạp vậy.
    Đoạn code này tui viết trong thư viện của tui, các cậu xem dùng được thì dùng:
    Code:
    // Convert an integer into binary string format
    void Num2BinString(UINT nNumber, LPTSTR lpBuffer, DWORD dwBufSize)
    {
        _ASSERTE(NULL != lpBuffer);
        _ASSERTE(FALSE = IsBadWritePtr(lpBuffer, dwBufSize));
        _ASSERTE(dwBufSize > 0);
        if ((0 == dwBufSize) || (NULL == lpBuffer))
            return;
    
        DWORD dwIndex = 0;	
        do
        {
            lpBuffer[dwIndex++] = (nNumber % 2) ? _T('1') : _T('0');
            nNumber /= 2;
        } while ((nNumber > 0) && (dwIndex < dwBufSize));
    
        lpBuffer[dwIndex] = _T('\0');
        _tcsrev(lpBuffer);
    }
    Nó chưa đúng với yêu cầu ra, nhưng cậu gì hỏi đấy cứ chỉnh sữa tiếp cho đúng yêu cầu. Tui giờ lười code lắm.
    Đã được chỉnh sửa lần cuối bởi TQN : 28-06-2007 lúc 09:39 PM.

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

  1. Bài tập C++ Cách để so sánh 2 chuỗi kí tự giữa chuỗi nhập từ phím và chuỗi từ file xem có giống nhau không?
    Gửi bởi davilson18 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 09-06-2012, 09:47 AM
  2. Lập trình C Thay thế chuỗi s1 trong chuỗi s bằng chuỗi s
    Gửi bởi duytue trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 7
    Bài viết cuối: 23-09-2011, 04:16 PM
  3. thay thế chuỗi con thứ i trong chuỗi mẹ bằng 1 chuỗi khác
    Gửi bởi nhat1811 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: 06-08-2011, 08:25 AM
  4. Trả lời: 1
    Bài viết cuối: 29-06-2011, 12:02 AM
  5. xem một từ trong chuỗi là một chuỗi con, sắp xếp các chuỗi con theo thứ tự tăng dần
    Gửi bởi qpkdct1101 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 0
    Bài viết cuối: 20-01-2011, 08:22 AM

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