大家思考一下:假设我们现在有两个变量,该如何交换这两个变量的值呢?
我们可以把变量看做装了水的瓶子,那这个问题就转换成如何交换两个瓶子里的水。通常的做法是:第一步,我们先找朋友借一个空瓶子;第二步,把第一个瓶子里的水倒入借来的瓶子中;第三步,把第二个瓶子里的水倒进第一个瓶子里;最后,借来瓶子中的水倒入第二个瓶子中(还有别忘了把瓶子还给你的朋友)。我们在C++中模拟这个过程:
int a = 10, b = 20;
int c; //变量c用来模拟借来的瓶子
c = a;
a = b;
b = c;
cout << a << ” ” << b << endl;
当然,还有不是“通常”的做法。要了解这种做法,首先要知道变量在给别的变量赋值时,自身不会发生变换的(这与现实生活中的倒水不同)。比如执行下面的语句:
c = a;
系统会用a的值赋为变量c赋值,这个过程中变量a的值是不会改变的。知道了这个事情,我们再来看一下下面的代码:
int a = 10, b = 20;
a = a + b;
b = a – b;
a = a – b;
cout << a << ” ” << b << endl;
这段代码同样实现了变量值的交换。聪明的你能看懂原理么?如果懂了做一下下面的填空题看看:
//交换两个变量的值
int a = 10, b = 20;
a = a – b;
______;
______;
cout << a << ” ” << b << endl;
int类型的特殊性质
对于int类型变量有个非常特别的性质:当两个整数做除法的时候得到的结果是商。比如下面的代码:
int a = 5, b = 2;
cout << a/b << endl;
输出的结果是2,不是5.2!一定要记住两个整数相除的时候得到的是商!!!那余数怎么求呢?C++给了另外一个运算符,专门计算两个整数相除的余数,他就是“%”。大家可以试一下cout << a%b << endl;的结果是什么?
这里一定要注意两点:
(1)对于除法运算符“/”,只有两边都是整数时结果才是商,两边只要有一个是其他类型的数据就会直接计算结果;
(2)求余数运算符“%”,两边必须是整数,否则系统编译时会报错!
现在我们挑战一下更有难度的一道题。假设输入一个三位数,求各个位上的数字之和是多少?首先我们需要知道怎么求个位。因为我们是十进制的整数n,所以除以10的余数就是个位,商就是去掉个位以后的数值。比如整数n的值是123。
123%10结果是3, 123/10的结果是12,即去掉个位以后的值。这样我们就可以用“降维”的方法来思考问题,把3位数降到2位数,然后再降到1位数。参考代码如下:
int n, sum = 0;
cin >> n; //输入一个三位整数
sum = sum + n % 10; //把个位加入到sum中
n = n / 10;//去掉个位数,把原来的十位变成个位
sum = sum + n % 10; //继续把个位加入到sum中
n = n / 10; //再次去掉个位,n只剩下一位了
sum = sum + n;
cout << sum << endl;
对于初学者目前只能这么来写,等学习了循环结构以后,这段代码可以得到极大的简化。另外这段代码直接修改了n的值,如果后面还需要用到n的值那么显然是不恰当的。这里给出一个通用的求整数每个位上值的方法:
int n;
cin >> n; //输入一个三位整数
int gw = n/1%10;//求个位值。除1就是为了跟后面对其,更加美观
int sw = n/10%10;//求十位值。
int bw = n/100%10;//求百位值。
int qw = n/1000%10;//求千位值。
… …
有了这个求各个位的方法,刚才求3位整数各个位之和的算法可以改写成下面的代码:
int n, sum, gw, sw, bw;
cin >> n; //输入一个三位整数
gw = n / 1 % 10; //求个位值
sw = n / 10 % 10; //求十位值。
bw = n / 100 % 10; //求百位值。
sum = gw + sw + bw;
cout << sum << endl;