今天室友问我怎么不借用中间变量来交换两个变量,想想看自己一般用的是
int temp=a;
a=b;
b=temp
然后想了一下又查阅了相关资料,总结了如下方法:
1.自加减法
#include <stdio.h>
int main()
{
int a,b;
while(scanf("%d%d",&a,&b) && a!=b)
{
printf("a=%d b=%d\n",a,b);
a+=b;
b=a-b;
a-=b;
printf("a=%d b=%d\n",a,b);
}
return 0;
}
2.按位异或法
a^=b;
b^=a;
a^=b;
3.其他:
乘法和除法也都是同样的道理,就不一一列举了,但又有细微差异,比如除法注意除数不能为0。
上述代码有两个问题,先说第一个,对象是整数变量,这个不够一般化,我们应该假设对象是字符串类型,因此,上述交换可以修正成交换首地址。
当然,最最一般的做法是交换二者的指针,比如下面的做法
swap(char **p1, char **p2)
{
char *p;
p = *p1;
*p1 = *p2;
*p2 = p;
}
void main()
{
char str1[] = "abcdef";
char str2[] = "ABCDEF";
char *p1 = str1, *p2 = str2;
printf("%s\t%s\n", p1, p2);
swap(&p1, &p2);
printf("%s\t%s\n", p1, p2);
}
如果不借助中间变量,也可以去采取连接和截断的法子。其实和加法是类似的原理。
比如用c++的string来实现的连接和截断,代码如下
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
class String
{
string word;
public:
friend istream& operator>>(istream& in,String &s)
{
in>>s.word;
return in;
}
friend ostream& operator<<(ostream& os,String &s)
{
os<<s.word;
return os;
}
String ()
{
word="";
}
String(const String& s)
{
word=s.word;
}
String (const string& s)
{
word=s;
}
String& operator=(const String s)
{
word=s.word;
return *this;
}
String operator+(String s)
{
return String(word+s.word);
}
String operator-(String s)
{
string temp=word;
unsigned int loc=temp.find(s.word,0);
if(loc!=string::npos)
{
temp.erase(loc,s.word.size());
return String(temp);
}
return *this;
}
};
int main()
{
String a,b;
while(cin>>a>>b )
{
cout<<"a="<<a<<endl<<"b="<<b<<endl;
a=a+b;
b=a-b;
a=a-b;
cout<<"a="<<a<<endl<<"b="<<b<<endl;
}
return 0;
}