【C++】C++程序结构入门之顺序结构二-灵析社区

跟着小潘学后端

一、两数交换

1.1 问题描述

输入两个数a,b;要求程序运行后a,b的值发生了互换。

1.2 分析问题

  1. 已知:a,b的值。
  2. 未知:a,b交换以后的值。

1.3 定义变量

根据分析后的已知,未知来确定变量。

#include<iostream>
using namespace std;
int main(){
	int a,b;
}

1.4 数据输入

根据定义的变量,哪些需要从键盘读取,哪些不需要。

#include<iostream>
using namespace std;
int main(){
	//1.分析问题: 已知:a,b的值。 未知:a,b交换以后的值。
	//2.定义变量 
	int a,b;
	//3.输入数据
	cin>>a>>b;
}

1.5 数据计算

有人会想既然是交换两个数,那么直接a=b,b=a不就可以了吗。简单,下一题。
真的是这样吗?

假如,小明和小刚两个人。小明有一个苹果,小刚有一个香蕉。他们两个人都想吃对方手里的水果,但是现在他们的一只手在做其他的事情,只有一只手拿着水果。这个时候他们能直接交换水果吗?

老师,这样不就行了!( •̀ ω •́ )✧

根本难不倒你,是吧!(╯▔皿▔)╯

可以看到从现实生活出发也是办不到的,计算机会怎么处理呢?
假如a=3,b=4。如果通过a=b,b=a的方式去交换两个数,可以看到当a=b时,a的值已经发生变化,不再是之前的值;所以在b=a时,b不能得到a=3这个值。

错误方法:

#include<iostream>
using namespace std;
int main(){
	//1.分析问题: 已知:a,b的值。 未知:a,b交换以后的值。
	//2.定义变量 
	int a,b;
	//3.输入数据
	cin>>a>>b;//a=3,b=4
	//4.数据计算
	a=b;//a=b=4
	b=a;//b=a=4
	//5.结果输出 
	cout<<a<<" "<<b;//4 4
}

那应该怎么去交换呢?聪明的人肯定已经想到了,找个人帮忙啊。

方法一:请个临时工

还是假如a=3,b=4。但是在b=a之前,我们通过temp=b这个操作,把b的值给了temp;然后当a需要b的值时,就去找temp要,如此就能实现两个数的交换。(temp 临时工)


程序如下:

#include<iostream>
using namespace std;
int main(){
	//1.分析问题: 已知:a,b的值。 未知:a,b交换以后的值。
	//2.定义变量 
	int a,b,temp;
	//3.输入数据
	cin>>a>>b;//a=3,b=4
	//4.数据计算
	temp=b;//temp=b=4
	b=a;//b=a=3
	a=temp;//a=temp=4
	//5.结果输出 
	cout<<a<<" "<<b;//4 3
}

那能不能不请临时工呢?

方法二:加法交换律

加法交换律:指两个加数相加,交换加数的位置,和不变

假如a = 3,b = 4;那么a + b = 3 + 4 = 7,b + a = 4 + 3 = 7。
7- b = a,那么刚好就可以把7- b的值给b,此时完成b=a的交换;想要a获得原来的b值,那么直接用和减去现在的b值(原来的a值)就能得到。

程序如下:

#include<iostream>
using namespace std;
int main(){
	//1.分析问题: 已知:a,b的值。 未知:a,b交换以后的值。
	//2.定义变量 
	int a,b;
	//3.输入数据
	cin>>a>>b;
	//4.数据计算
	a=a+b;
	b=a-b;
	a=a-b;
	//5.结果输出 
	cout<<a<<" "<<b;
}

方法三:swap函数

在C++中,swap函数用于交换两个变量的值。实际上就是方法一,但是不需要自己去写交换逻辑。

程序如下:

#include<iostream>
using namespace std;
int main(){
	//1.分析问题: 已知:a,b的值。 未知:a,b交换以后的值。
	//2.定义变量 
	int a,b,temp;
	//3.输入数据
	cin>>a>>b;
	//4.数据计算
	swap(a,b);
	//5.结果输出 
	cout<<a<<" "<<b;
}

1.6 结果输出

输出如上。

1.7 小结

两数交换还是使用的非常多的,比如排序,找最大,三角形的验证等等。难度不高,多练习即可掌握。

二、拆位求解

2.1 问题描述

1027 - 求任意三位数各个数位上数字的和

2.2 分析问题

  1. 已知:x的值。
  2. 未知:x各数位相加后的和s。

2.3 定义变量

根据分析后的已知,未知来确定变量 x,s。

#include<iostream>
#include<iomanip>
using namespace std;
int main(){
	//1.分析问题:已知:x的值。 未知:x各数位相加后的和s。
	//2.定义变量 
	int x,s;
	return 0;	
}

2.4 数据输入

根据定义的变量,x需要输入,其它不需要。

#include<iostream>
#include<iomanip>
using namespace std;
int main(){
	//1.分析问题:已知:x的值。 未知:x各数位相加后的和s。
	//2.定义变量 
	int x,s;
	//3.输入数据 
	cin>>x;
	return 0;	
}

2.5 数据计算

在解决问题之前,我们先来了解什么是数位。数位是指一个数中的每一位的数字,比如x = 123,那么x的百位=1,十位=2,个位=3;即x = 1 * 100 + 2 * 10 +3。


ok,是不是很简单。那怎么去得到每个数位的数呢?

这里我们复习一下数学中的除法。有一个数x = 123。

从第二张图可以看到,当123除以10以后产生了余数3,而3刚好是我们想要的个数位。那我们可以通过 %10 ( 取余 )得到3。

但是不能通过 %100 得到2,因为得到的数是23。如果这个数是12,那么 % 10 = 2。如何将123变成12呢?要知道int整数类型在除法时,是向下取正,不管余数是1还是9都不会进位。所以想得到12可以用123 / 10。

想要的得到最高位,直接除以最高位数的0即可。比如123想要得到1,那么直接123 / 100。

因此拆位的公式就是:

  1. 个位:%10;
  2. 中间位:/数位%10;
  3. 最高位 :/数位。

那么根据拆位公式和本题要求,需要求出个位,十位,百位;再将个位,十位,百位相加。

程序如下:

#include<iostream>
#include<iomanip>
using namespace std;
int main(){
	//1.分析问题:已知:x的值。 未知:x各数位相加后的和s。
	//2.定义变量 
	int x,s;
	//3.输入数据 
	cin>>x;
	//4.数据计算 
	int ge=x%10;
	int shi=x/10%10;
	int bai=x/100;
	
	s=ge+shi+bai;

	return 0;	
}

2.6 结果输出

将结果输出即可。

#include<iostream>
#include<iomanip>
using namespace std;
int main(){
	//1.分析问题:已知:x的值。 未知:x各数位相加后的和s。
	//2.定义变量 
	int x,s;
	//3.输入数据 
	cin>>x;
	//4.数据计算 
	int ge=x%10;
	int shi=x/10%10;
	int bai=x/100;
	
	s=ge+shi+bai;
	//5.输出数据
	cout<<s;

	return 0;	
}

2.7 小结

以上就是关于拆位求解的内容,主要记住拆位公式。关于短除法会在循环结构入门介绍。

三、课后作业

1028 - 输入一个三位数,把个位和百位对调后输出

1390 - 四位数的和

1109 - 加密四位数

1020 - 算算和是多少

1029 - 倒序输出一个四位整数

1418 - 求一个5位数的各个位之和

四、总结

以上的两个内容是以后学习中使用的次数非常多的,因此一定要掌握

阅读量:513

点赞量:0

收藏量:0