开始学习C语言C++在这里记录自己的成长。简单的两变量交换问题
2016-03-15 12:34
531 查看
这几天开始着手学习C语言C++,今天正事加入CSDN的大家族,希望在这里共同成长,学到更多的知识。第一次写博客,有哪些不对的地方希望各位大神批评指出。
刚接触到一个双变量交换的简单问题在这里讨论两个变量的交换问题好像过于简单了点,毕竟本人刚刚开始学习,就当是自己一点一滴的成长吧,希望大家不要见笑,下面就来写写实现它的几种不同的方法。
1.好多人遇到这种问题的第一想法肯定是声明一个中间变量,然后利用中间变量来实现变量交换。如下:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a =2, b =4, temp;
temp = a;
a = b;
b = temp;
printf("a=%d,b=%d\n",a,b);
system("pause");
return 0;
}
仅仅几行代码这个问题就被解决掉了,轻松,Easy.
那么如果不利用中间变量,就在已经给定的两个变量的情况下要怎么来实现呢?当时我想到的也就是第一种方法,原谅自己太笨。其实还乐意利用加减法和乘除法来解决这个问题。
2.利用加法和乘法通过改变其中一个变量的值,然后继续减或除,改变另一个变量的值,从而实现交换。
a = a + b;
b = a - b;
a = a - b;
--------------------------------------------------------------------------
a = a*b;
b = a / b;
a = a / b;
这样也就简单的实现了交换问题。但是如果稍加思索你就会发现这种做法其实是存在安全隐患的,开始声明的两个变量都是整形的,而且变量的值比较小,如果变量值在比较大的情况下,通过加和乘又赋值给整形变量那么难免会超出整形变量的表示范围,这样就出错了。
那么还有什么办法来解决这个问题呢?办法当然是有的,就是利用逻辑运算符。
3.通过利用异或(“^”)逻辑运算符来实现。变量在计算机中存储的时候都是转化成对应的二进制来存储的。
其中:(方便起见这里只用四位二进制表示)
a:0010
b:0100
a^b:0110
不难发现:b=(a^b)^b :0010
a=b^(a^b) :0100
a = a^b;
b = a^b;
a = b^a;
这样这个问题也就解决掉了。
但是考虑到程序的安全性,时间开销和空间开销,相比之下三种方法中还是第一种更好一点。
如果博客中有什么问题和遗漏希望各位大神批评指出,谢谢大家。
刚接触到一个双变量交换的简单问题在这里讨论两个变量的交换问题好像过于简单了点,毕竟本人刚刚开始学习,就当是自己一点一滴的成长吧,希望大家不要见笑,下面就来写写实现它的几种不同的方法。
1.好多人遇到这种问题的第一想法肯定是声明一个中间变量,然后利用中间变量来实现变量交换。如下:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a =2, b =4, temp;
temp = a;
a = b;
b = temp;
printf("a=%d,b=%d\n",a,b);
system("pause");
return 0;
}
仅仅几行代码这个问题就被解决掉了,轻松,Easy.
那么如果不利用中间变量,就在已经给定的两个变量的情况下要怎么来实现呢?当时我想到的也就是第一种方法,原谅自己太笨。其实还乐意利用加减法和乘除法来解决这个问题。
2.利用加法和乘法通过改变其中一个变量的值,然后继续减或除,改变另一个变量的值,从而实现交换。
a = a + b;
b = a - b;
a = a - b;
--------------------------------------------------------------------------
a = a*b;
b = a / b;
a = a / b;
这样也就简单的实现了交换问题。但是如果稍加思索你就会发现这种做法其实是存在安全隐患的,开始声明的两个变量都是整形的,而且变量的值比较小,如果变量值在比较大的情况下,通过加和乘又赋值给整形变量那么难免会超出整形变量的表示范围,这样就出错了。
那么还有什么办法来解决这个问题呢?办法当然是有的,就是利用逻辑运算符。
3.通过利用异或(“^”)逻辑运算符来实现。变量在计算机中存储的时候都是转化成对应的二进制来存储的。
其中:(方便起见这里只用四位二进制表示)
a:0010
b:0100
a^b:0110
不难发现:b=(a^b)^b :0010
a=b^(a^b) :0100
a = a^b;
b = a^b;
a = b^a;
这样这个问题也就解决掉了。
但是考虑到程序的安全性,时间开销和空间开销,相比之下三种方法中还是第一种更好一点。
如果博客中有什么问题和遗漏希望各位大神批评指出,谢谢大家。
相关文章推荐
- C++怎么把字符串中的小写变为大写
- C++中的struct和class的区别
- C++用字符数组实现MyString类
- 详解让C++新手闹心的语句“cout<<"Hello!"<<endl;”
- 详解C++中经常看到的#include <iostream> using namespace std;
- C++引入名字空间(namespace)意义何在?为什么using namespace std会成为常用语句?
- Jni中C++和Java的参数传递(转)
- C语言实现顺序表的所有操作代码
- C++ 内存池学习 -- C++ Memory Pool
- C语言文件操作 fopen, fclose, mkdir详解
- C++章节练习题
- 单片机C语言中define的妙用
- C++笔试题(十)
- 值得推荐的C/C++框架和库
- C++笔试题(七)
- C/C++文件I/O操作
- c++字符串拷贝几个方法浅析sprintf,strcpy及memcpy
- C++笔试题(四)
- C++笔试题(三)
- C++ 函数的重载