#include <stdio.h>
#include <conio.h>
int hoanvi(int a , int b)
{
int a1,a2,b1;
a1=a+b;
b1=a1-b;
a2=a1-b1;
return a2;
return b1;
}
int main()
{
int a,b;
printf("nhap a,b: ");scanf("%d %d",&a,&b);
printf("a,b sau: %d %d \n",hoanvi(a,b));
return 0;
}
Vấn đề về thuật toán hoán vị 2 số nguyên?
hàm hoán vị của bạn sai rồi, bạn có thể khai báo
int temp = a;
a = b;
b = temp;
2 Likes
Một số cái sai:
- Biến truyền vào theo kiểu tham trị thì sẽ không thay đổi được (do đó không hoán đổi được). (Cần truyền theo tham chiếu)
- Hàm chỉ có thể trả về nhiều nhất 1 giá trị mà thôi.
- Nếu đã dùng 3 biến thì làm như bạn comment đầu tiên là tốt nhất, còn không vẫn có thể dùng 2 biến để hoán đổi được.
1 Like
có thể gợi ý cho mình chuyển giá trị 2 biến mà không dùng biến trung gian không
C1
a = a + b;
b = a - b;
a = a - b;
C2
ngoài ra bạn nên dùng phép ^ (XOR)
a = a ^ b;
b = a ^ b;
a = a ^ b;
2 cách này mình thử thì thấy thời gian nó gần gần nhau thôi.
2 Likes
1 Like
tks hai bạn 20char
#include <stdio.h>
#include <conio.h>
void hoanvi(int &a , int &b)
{
//truyền tham chiếu thì nó sẽ nhận địa chỉ của a và b
// nên khi kết thúc hàm giá trị a và b thay đổi.
//bạn thử truyền vào (int a , int b) để thấy sự khác biệt nhé.
int temp = a;
a = b;
b = temp;
}
int main()
{
int a,b;
printf("nhap a,b: ");scanf("%d %d",&a,&b);
printf("a,b sau: %d %d \n",a, b);
return 0;
}
1 Like
Bạn có thể giải thích giùm mình ý nghĩa của phép ^(XOR) với không >
Vì nó thao tác trực tiếp trên bit nên sẽ nhanh hơn.
C làm gì có References mà bạn sử dụng. C chỉ có con trỏ thôi ạ.
Mình thích cách thứ 2 của bạn. Cách 1 mình sợ miền giá trị lắm
1 Like
Cách 2 là thông dụng nhất cách 1 (hai biến) chỉ có hỏi đố mới dùng, mà nên dùng xor.
Cách tính tổng rồi trừ có 2 nhược điểm:
- Overflow
- Lý do này có phần hơi nhảm nhí: Thực hiện phép cộng lâu hơn phép gán
1 Like