Vấn đề về thuật toán hoán vị 2 số nguyên?

#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;
	
}

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:

  1. 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)
  2. Hàm chỉ có thể trả về nhiều nhất 1 giá trị mà thôi.
  3. 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 :smiley:

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 :smiley: 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 :slight_smile: 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:

  1. Overflow
  2. 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
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?