Từ 1 tới 9 trên tổng số 9 kết quả

Đề tài: Làm cách nào để hoán vị 2 số nguyên mà không dùng thêm biến thứ 3?

  1. #1
    Ngày gia nhập
    08 2011
    Nơi ở
    Trà Vinh
    Bài viết
    20

    Mặc định Làm cách nào để hoán vị 2 số nguyên mà không dùng thêm biến thứ 3?

    Mình có một bài tập sắp xếp mảng tăng dần. Nhưng đề yêu cầu bắt buộc xây dựng hàm hoán vị 2 số nhưng không sử dụng biến thứ 3.
    Nó là con của thằng nào ? Con của thằng nào ? Nói mau!!!!!!!!!!!!!!!

  2. #2
    Ngày gia nhập
    07 2010
    Nơi ở
    chỗ kín
    Bài viết
    446

    Code:
    C1:
    #define SWAP(a, b)    (a ^= b ^= a ^= b)
    
    C2:
    void SWAP(short a, short b)
    {
     a += b; 
     
     b = a - b; 
     
     a -= b;
    }
    chỉ áp dụng cho số nguyên.

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

    Trích dẫn Nguyên bản được gửi bởi pkthanh92 Xem bài viết
    Code:
    C1:
    #define SWAP(a, b)    (a ^= b ^= a ^= b)
    
    C2:
    void SWAP(short a, short b)
    {
     a += b; 
     
     b = a - b; 
     
     a -= b;
    }
    chỉ áp dụng cho số nguyên.
    Cách 2 của ptkhanh là cách hay, vẫn áp dụng hoàn toàn cho int , float và double mà .

  4. #4
    Ngày gia nhập
    05 2011
    Nơi ở
    /home/kenny
    Bài viết
    11

    cách 2 thiếu tham chiếu

  5. #5
    Ngày gia nhập
    08 2011
    Bài viết
    98

    CCó thể dùng :


    C Code:
    1. void swap(int &a,int &b)
    2. {
    3.      a = a ^ b;//a = a xor b
    4.      b = a ^ b;//b = a xor b
    5.      a = a ^ b;//a = a xor b
    6. }


    Trong python thì

    Code:
    a,b = b,a
    Nghe Metal và dịch thơ
    lttqstudy.wordpress.com

  6. #6
    Ngày gia nhập
    07 2010
    Nơi ở
    chỗ kín
    Bài viết
    446

    Mặc định Làm cách nào để hoán vị 2 số nguyên mà không dùng thêm biến thứ 3?

    Trích dẫn Nguyên bản được gửi bởi n0b0dy.n0l0v3 Xem bài viết
    Cách 2 của ptkhanh là cách hay, vẫn áp dụng hoàn toàn cho int , float và double mà .
    Trích dẫn Nguyên bản được gửi bởi kennyZ Xem bài viết
    cách 2 thiếu tham chiếu
    um, hơi sơ suất tí chút.

    thực ra cách 1 hay cách 2 đều có thể quy về một cách hết

    f là hàm nào đấy (2 biến) có hàm "đối" là g. ( "đối" mang tính chất cảm tính)

    quy tắc chung:
    C1: f là phép xor, g cũng là phép xor
    C2: f là phép +, g là phép -
    có thể mở rộng thêm một phương án nữa
    a*=b
    b=a/b
    a=a/b
    f là nhân, g là chia.

    đây là một cách nữa:
    x = x mũ y
    y = căn bậc y của x
    x = loga cơ số y của x

    trời ui, nhiều lắm.
    Trích dẫn Nguyên bản được gửi bởi meterpreter Xem bài viết
    với các tham số là user-defined thì sao???
    ủe-defined là thế nào, đề đã bảo là 2 số nguyên mà.

  7. #7
    Ngày gia nhập
    08 2011
    Nơi ở
    /pentest
    Bài viết
    44

    uhm cái này chỉ áp dụng swap 2 số nguyên, mình test thử swap các kiểu dữ liệu khác đều không được, nhưng mà bản chất thì chỉ là 3 phép toán xor theo bít thôi mà, có vấn đề gì đó.

  8. #8
    Ngày gia nhập
    08 2011
    Nơi ở
    Trà Vinh
    Bài viết
    20

    Cảm ơn mấy bác nhiều!!! Nhưng nếu cách cộng, nhân, mũ thì với những số nguyên lớn sẽ không đúng thì phải?
    Nó là con của thằng nào ? Con của thằng nào ? Nói mau!!!!!!!!!!!!!!!

  9. #9
    Ngày gia nhập
    07 2011
    Bài viết
    160

    Trích dẫn Nguyên bản được gửi bởi meterpreter Xem bài viết
    uhm cái này chỉ áp dụng swap 2 số nguyên, mình test thử swap các kiểu dữ liệu khác đều không được, nhưng mà bản chất thì chỉ là 3 phép toán xor theo bít thôi mà, có vấn đề gì đó.
    Các kiểu dữ liệu khác (ví dụ số thực) cũng được chứ bạn. Vấn đề là phải ép kiểu vì float/double không có phép toán xor (^)

    C Code:
    1. #define CAST(type, pvar) (*(type*)(pvar))
    2.  
    3. void swapd(double *x, double *y)
    4. {
    5.     CAST(long long, x) ^= CAST(long long, y);
    6.     CAST(long long, y) = CAST(long long, x) ^ CAST(long long, y);
    7.     CAST(long long, x) ^= CAST(long long, y);
    8. }
    9.  
    10. void swapf(float *x, float *y)
    11. {
    12.     CAST(long, x) ^= CAST(long, y);
    13.     CAST(long, y) = CAST(long, x) ^ CAST(long, y);
    14.     CAST(long, x) ^= CAST(long, y);
    15. }

    Note: Trong đại đa số các compiler thì long long là 8 bytes, nhưng không chắc chắn luôn là 8 byte với mọi compiler đâu nhé!!

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

  1. In ra màn hình theo thứ tự tăng dần các số nhập vào. Chỉ được dùng thêm hai biến phụ
    Gửi bởi devildn132 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 23
    Bài viết cuối: 26-08-2014, 09:02 AM
  2. Bài sàng nguyên tố bị lỗi sai khi dùng mảng đánh dấu là biến địa phương
    Gửi bởi Ken Fei trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 23-08-2013, 09:36 AM
  3. Cần bán laptop Acer Emachies D792, máy không dùng mới 99,9%, nguyên tem và mới dùng
    Gửi bởi nguyenictu trong diễn đàn Giới thiệu website, sản phẩm của bạn
    Trả lời: 0
    Bài viết cuối: 25-04-2012, 12:01 PM
  4. tìm số nguyên tố(prime) dùng biến động trong lập trình C?
    Gửi bởi gold_sea trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 15-03-2011, 09:32 PM
  5. Kỹ thuật C++0x Cách dùng itoa biến đổi số nguyên thành chuỗi trong lập trình HĐT
    Gửi bởi thaihoa311 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 09-05-2010, 08:23 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