文章目录
- 前言介绍
- 1. for 语句
- 1.1 语法结构
- 1.2 语法流程的执行过程
- 1.2.1 案例 1:循环的正序输入和倒序输入
- 1.2.2 案例2 : 求1~n的平方数
- 1.2.3 案例 3: 求输入a和b,求a~b区间数.
- 1.3 for 循环案例练习
- 1.3.1 求最大值与最小值
- 1.3.2 计算奇数和和偶数和
- 1.3.3 计算平均气温与最高气温
- 1.3.4 计算阶乘
- 1.3.5 计算 正常血压
- 1.3.6 角谷定理 (扩展知识)
- 1.4 关键字 break 和 continue
- 1.4.1 break
- 1.4.2 continue
- 2. while 语句
- 2.1 语法结构
- 2.1.1 使用案例(Noip普及试题)
- 2.1.2 注意三要素,避免死循环产生
- 2.2 语法流程的执行过程
- 2.2.1 案例1: 正序和倒序 1~100的范围
- 2.2.2 案例 2: 判断输入数,是几位数
- 2.3 while循环案例(扩展)
- 2.3.1 银行取款输入密码
- 2.3.2 欧几里德算法(最大公约数)
- 2.3.3 斐波那契数列
- 3. 循环算法扩展
- 3.1 质数(素数)
- 3.2 质数统计(在3.1基础上扩展)
- 3.3 回文数
- 4. 嵌套循环
- 4.1 什么是嵌套循环
- 4.2 打印直角三角形
- 4.3 打印等腰三角形
- 4.4 打印99乘法表
- 5. 知识扩展
- 5.1 枚举法
- 5.1.1 百钱买百鸡
- 5.1.2 枚举应用--无重复事项
前言介绍
- C++中支持的三种基本的运行流程:顺序结构,选择结构,循环结构(本节课内容) 。
- 生活中经常遇到一些 重复性工作,这些反复执行多次同样的操作,将书包里的十本书,摆放到书架的指定位置上,要做的工作就是重复十次:拿起书→找位置→摆好书。每次只考虑拿一本的话,就会重复十次 ,就是循环思想。 用循环思想编写程序就是所谓的 循环结构程序。
- 打印书籍。
- 切黄瓜。
- 操场跑圈。
- 在C++中,为了表现循环思想提供了,三种循环,
for ,while,do-while
三种不同格式的循环语句。- 上述提到的:拿起书→找位置→摆好书。 这个重复内容,就是循环语句的循环体。
1. for 语句
1.1 语法结构
-
为什么要学习循环,怎么去理解循环? 先看一个下面的案例。
- 输出 好好学习天天,天天向上。1000次! 怎么设计程序。
- 如果一次一次用手写,那可真是太秀了。
#include <iostream> using namespace std; int main(){ //1.输出1000次我爱学习 cout<<"好好学习天天,天天向上"<<endl; cout<<"好好学习天天,天天向上"<<endl; cout<<"好好学习天天,天天向上"<<endl; cout<<"好好学习天天,天天向上"<<endl; //.....太麻烦了...? //2.怎么有更好的办法解决问题? return 0; }
- 输出 好好学习天天,天天向上。1000次! 怎么设计程序。
-
语法结构,关键字
for
,有两种格式:- 格式一:省略{}花括号。
for (循环变量的初始值;循环条件;循环变量增量) 循环语句的循环体1; 循环语句的循环体2;
- 格式二 (推荐使用): 使用{}将循环语句包裹起来。
for(循环变量的初始值; 循环条件;循环变量的增量){ 循环语句的循环体1; 循环语句的循环体2; 循环语句的循环体3; }
3. 案例实现:
- 循环语句,好好学习,天天向上 。1000次! 循环程序设置。#include <iostream> using namespace std; int main(){ //1.循环语法格式推荐使用{} //注意, 先声明 循环的初始值 int i =起始值。 for (int i=1;i<=1000;i++){ //1.1 循环语句体 cout << "好好学习天天,天天向上="<< i <<endl; } return 0; }
1.2 语法流程的执行过程
-
语法循环控制流程:
for (int i=1;i<=1000;i++){ //1.1 循环语句体 cout << "好好学习天天,天天向上="<< i <<endl; }
-
int i 会首先被执行, 且只会执行一次。这一步需要先声明并初始化任何循环控制变量。
- 也可以不在这里写任何语句,只要有一个分号出现即可 (不推荐)。
-
接下来,会判断
i<=1000
。- 如果为真,则执行循环主体。
- 如果为假,则不执行循环主体,且控制流会跳转到紧接着 for 循环的下一条语句。
-
在执行完 for 循环主体后,控制流会跳回上面的
i++
增量语句。- 更新循环控制变量。
- 该语句可以留空,只要在条件后有一个分号出现即可 (不推荐)。
-
条件再次被判断。如果为真,则执行循环,这个过程会不断重复(循环主体,然后增加步值,再然后重新判断条件)。 在条件变为假时,for 循环终止。
- 循环流程图如下:
- 循环流程图如下:
1.2.1 案例 1:循环的正序输入和倒序输入
-
如何输入一个数,正序输出1~n 和 倒序输出 n ~1 。
- 问题分析:
- 声明一个循环变量并赋值为 ?
- 循环变量最大值会不会超过?
- 循环变量每次如何变化?
#include <iostream> #include <iomanip> using namespace std; int main(){ /** 分析: 正序和倒序, 1. 正序: 起始值 为 1 范围 i<= a, 每次循环 自增 2. 倒序: 起始值 为 a 范围 i >=1, 每次循环 自减 */ int a; cin >> a; //1.正序输出1~n. for(int i=1;i<=a;i++){ cout << i << endl; } //2.倒序输出 n~1. for (int i =a;i>=1;i--){ cout << i << endl; } return 0; }
- 问题分析:
1.2.2 案例2 : 求1~n的平方数
-
对于给定的任意正整数 a,输出1到a的平方数。
- 平方数就是:表示一个数乘以它自身而得到的结果,例如 2乘以2 得到的是4, 4就是2的平方数。
- 输入10 ,结果就应该是1~10 每一个数的平方数。
#include <iostream> #include <iomanip> using namespace std; int main(){ /** 1. 分析第一步: 输入数为 5 结果应该是 1*1 2*2 3*3 4*4 5*5 分析点1:循环次数 ? a次 */ int a; cin >> a; //循环次数由 a决定 for (int i =1;i<=a;i++){ //循环语句体: " "使用空格分割 cout << i*i << " "; } return 0; }
1.2.3 案例 3: 求输入a和b,求a~b区间数.
-
在控制台中,同一行输入两个数 a 和 b,输出a和b的之间的数。
- 例如: 3 9 , 输入 3 4 5 6 7 8 9。
#include <iostream> using namespace std; int main(){ /** 输入两个整数 a和b ,输出a和b之间的整数. 分析: a和b之间的数, 起始值就应该从a开始, 结尾就以b为结尾. */ int a,b; cin>> a>>b; for (int i =a;i<=b;i++){ cout << i << " "; } return 0; }
1.3 for 循环案例练习
1.3.1 求最大值与最小值
-
输入一个数n,然后n是多少,就输入多少个整数, 并且找出 最大的数 (n为整数类型。)
-
注意: n为几,相当于你输入多少整数。
-
分析:需要比较输入的数值,然后依次比较找出最大的。
-
代码如下:
#include <iostream> using namespace std; int main(){ //1.输入n,n觉定了输入整数的个数. int n , m, max; cin >>n; //2.使用循环 for (int i=1;i<=n;i++){ //输入次数 cin >> m; if (m>max){ max =m; } } cout << "最大值: " <<max; return 0; }
- 自己思考,求 最小值。 独立完成。
//TODO 自己动手
-
1.3.2 计算奇数和和偶数和
-
输入一个数n,计算 1~n之间的整数的 奇数之和 和 偶数 之和。
- 输入 10 , 计算 1~10之间的和。
- 输入 100, 就计算 1 ~ 100之间的和 。
#include <iostream> using namespace std; int main(){ //1.输入n. int n; int j_sum=0,o_sum=0; cin >>n; //2.使用循环 for (int i=1;i<=n;i++){ //输入次数 if (i%2==0){ o_sum+=i; }else{ j_sum+=i; } } cout <<"奇数和: "<<j_sum << " " <<"偶数和: " << o_sum; return 0; }
1.3.3 计算平均气温与最高气温
-
某市七月份中旬温度如下:
- 36.3,37.0,34.8,35.0,36.1,34.4,33.9,34.8,35.5,35.7。 要求计算中旬的平均气温和高温天数(大于等于35度为高温天)。请设计程序,输入十天温度,输出平均气温(保留2位小数)和高温天数。
- 要求:第一行输入10个数字;
- 输出:两个数字,第一个数字为高温天数,第二个数字是平均气温。
-
输入样例如下:
- 36.3,37.0,34.8,35.0,36.1,34.4,33.9,34.8,35.5,35.7。
- 输出样例: 6 35.35。
#include <iostream> #include <iomanip> using namespace std; int main(){ double n,sum_n; int cnt=0; //1.通过循环依次输入10个数. for (int i =1; i<=10; i++){ cin>>n; //1.1 进行判断 if (n>=35) { cout <<"------" <<n<<endl; cnt++; //计数 } sum_n +=n; //累计天数求和. } //保留2位小数 cout << fixed << setprecision(2); cout << "高温天数: "<< cnt << endl; cout << "平均气温: " << sum_n/10 ; //输入天气的平均气温. return 0; }
1.3.4 计算阶乘
- 利用for循环计算n!的值。
- 百科解释: 一个正整数的阶乘是所有小于及等于该数的正整数的积,并且0的阶乘为1,自然数n的阶乘写作n!
- 记住 0的阶乘就是1.
#include <iostream> using namespace std; int main(){ //1.定义n int n; int sum_i=1; //求乘积.起始值位1 cin >> n; //n的阶乘就是 n!= 1*2*3*n for(int i =1;i<=n;i++){ sum_i *= i; //5!= 1*2*3*4*5 } cout << sum_i<<endl; return 0; }
1.3.5 计算 正常血压
- 问题描述: 监护室每小时测量一次病人的血压,若收缩压在 90-140 之间
并且
舒张压 在 60-90之间(包含端点值 )则称之为正常, 现给出某病人若干次测量的血压值统计病人保持正常血压的小时数。
- 考虑分析, 需要几个变量, t1 为收缩,t2为舒张, cnn为正常。
#include <iostream> using namespace std; int main(){ int t1,t2,cnn=0,n; //t1 收缩 ,t2舒张, cnn为计数器开始为0,n为几条数据 cin >>n; for (int i=1;i<=n;i++){ cin >>t1>>t2; //接受数据 //2.进行判断各种符合条件的范围,舒张压和收缩压 if(60<=t1&&t1<=140&&60<=t2&&t2<=90) { //符合条件的进行计数 cnn++; } } cout << "符合样式" << cnn; return 0; }
1.3.6 角谷定理 (扩展知识)
#include <iostream>
using namespace std;
int main(){
/**
1.两种思路
如果奇数 n*3+1
如果偶数 n/2 ...直到余数为1
2.假设这个数初始值为5 ,计算过程 16,8,4,2,1.
*/
int n;
cin >>n;
while(n!=1){ //直到n=1时,退出循环.
//进行处理数据
if(n%2){
cout<<n << "*3+1= "<< n*3+1 <<endl; //输出格式
n = n*3+1;
}else{
cout<< n << "/2=" << n/2 <<endl; //输出格式
n= n/2;
}
}
cout <<"End";
return 0;
}
1.4 关键字 break 和 continue
1.4.1 break
-
中断所在的循环体,跳出本层循环。
- 注意: 跳出最近的一层循环,并不能跳出所有循环。
#include <iostream> using namespace std; int main(){ for (int i = 1; i<=10 ; i++){ if (i==5){ break; //i等于3时,跳出循环. } cout << i <<endl; //5不输出,之后也没有 } return 0; }
1.4.2 continue
- 跳出当前循环,执行下一次循环。
- 注意: 同break,一样,只能跳出最近的循环。
#include <iostream> using namespace std; int main(){ for (int i = 1; i<=10 ; i++){ if (i==5){ continue; } cout << i <<endl; //跳过5输出其他 } return 0; }
2. while 语句
2.1 语法结构
-
while循环与for循环都可以处理循环,那它们之间有何不同?
- 循环初始值
- 循环范围(循环条件)
- 控制循环的增量与减量
#include <iostream> using namespace std; int main(){ /** 循环三要素: 1. 循环初始值 2. 循环范围 3. 控制循环增/减量 */ int i =1; //1.循环初始值 while(i<=10){//2.循环范围 //语句体 cout << i<<endl; //3.控制循环增量 i++; } return 0; }
-
流程图如下:
2.1.1 使用案例(Noip普及试题)
-
考试结束后,老师想计算全体学生的 平均分, 不知道考试人数具体是多少,直到考试参加人数成绩都不是0分。
- 提供若干个考试成绩,输入0分的就结束,计算平均值。
- 并且 保留2位小数。
-
上述分析需要 注意 哪些点?
- 重复做的事情: 录入成绩。
- 成绩不为零: 循环条件。
#include <iostream> #include <iomanip> using namespace std; int main(){ //1.定义循环的初始值 double score,sum_score=0; // 成绩和总和 int count=0; //计数器 cin >>score; while(score!=0) { //求和 sum_score+=score; //计数 count++; //控制循环的增减范围 cin >>score; } //保留小数 cout << fixed << setprecision(2); cout<< "平均成绩: "<< sum_score/count ; return 0; }
2.1.2 注意三要素,避免死循环产生
- 什么是无限循环 ?什么情况下会产生无限循环?
- 举一个例子: 操场跑10圈,观察下,下面代码有什么问题?
#include <iostream> using namespace std; int main(){ //牢记循环三要素:1.循环初始值,2.循环条件,3.控制循环的变量 int i=10; //1.循环初始值 ? 从哪开始 while(0<i){ //2. 循环范围 是正序还是倒序 cout << i<<endl; i++; //3.控制循环的变量 变量是增加还是减少 } return 0; }
2.2 语法流程的执行过程
-
while循环的循环流程是什么样的 ?
- 可以对比for循环流程学习。
- 我们拿写作业这件事举例子。
条件是否成立{ 我一定要做的事情 }
-
案例代码实现:
- 根据流程执行过程,需要根据循环条件决定。
- 重复的事情: 做作业。
- 循环条件: 是否完成作业。
#include <iostream> using namespace std; int main(){ //1.变量初始值, false 没做完, true做完 string answer="no"; while (answer!="yes"){ //2.循环范围 只要不是yes就结束. cout <<"没做完,继续做作业..."; cin >> answer; //3.控制循环增量 } //结束 cout << "出去玩耍"; return 0; }
2.2.1 案例1: 正序和倒序 1~100的范围
-
打印输出 1~100 和 100 ~1的范围。
- 使用 while 的形式循环 。
- 倒序 100 ~ 1 。
//1.倒序. #include <iostream> using namespace std; int main(){ int i =100;//范围起始值 while(i>=1){ //循环范围 cout << i<<endl; i--; // 控制循环的变量 } return 0; }
- 正序 1 ~ 100 。
#include <iostream> using namespace std; int main(){ int i = 1;//1.范围起始值 while(i<=100) { //2.循环条件 cout << i <<endl; i++; // 3. 控制循环的变量 } return 0; }
2.2.2 案例 2: 判断输入数,是几位数
- 需求:任意输入一个数字,输出这个数字是一个几位数。
- 例如: 输入 12345 输出 5位数。
#include <iostream> using namespace std; int main(){ /** 需求: 1. 任意输入一个数,判断它是几位数. 分析: 需要使用位数分离,处理该问题 然后每处理一位,累计一次. 循环条件: ? 只要是余数为 0 就是一位数. 重复问题: ? num= num/10 */ int num; int count=0;//计数器 cin >>num; //输入一个数 while(num!=0){ //重点 :循环条件 num/=10; //重点: 去掉一位数 count++;//计数 } cout << count <<endl; return 0; }
2.3 while循环案例(扩展)
2.3.1 银行取款输入密码
- 在银行取款时,需要输入密码(密码三位数),密码正确才可以进行取款操作;如果连续三次输入密码错误,就会提示错误信息,并且冻结账户。
- 给出错误提示信息, 正确,错误,冻结。
- 分析思路:
- 首先需要预设密码,然后在输入密码,和 输入次数。
- 重复做的事,是什么? 循环条件是什么?
#include <iostream> using namespace std; int main(){ int password=123; //预设密码 int i_password; //输入密码 int n=0; //输入次数 //不循环的条件是: //大于三次和密码相同就不循环 while(n<3&&i_password!=password) { //每次都累计一次 n++; cin >> i_password; //错误的给出提示 if(i_password!=password){ cout<< "错误" << endl; } } //2.正确给出提示 if(password == i_password){ cout<< "正确" << endl; }else if(n==3){//如果3次就需要冻结 cout <<"冻结"<< endl; } return 0; }
2.3.2 欧几里德算法(最大公约数)
-
又称为,辗转相除法,属于一个数学技巧。
- 对于任意两个自然数 a 和 b ,求他们的最大公约数。
-
分析具体做法:
- 分析两个数,需要两个数。
- 案例如下:
#include <iostream> using namespace std; int main(){ //1.声明两个变量 int a,b,r; cin >> a>>b; //2.判断余数是否为零. //2.1如果为 0, b就是最大公约数. r = a%b; while(r!=0) { //2.2 进行交换 a=b; b=r; r=a%b; } cout << b << endl; //最大公约数 return 0; }
2.3.3 斐波那契数列
-
什么是 斐波那契数列 (兔子数列)?
- 斐波那契数列指的是这样一个数列:1,1,2,3,5,8,13,21,34,55,89…
- 这个 数列从第3项开始,每一项都等于前两项之和。
- 思考下面的枚举方式是否可行?为什么?
-
如何解决上述问题。
- 需要第三方变量存储c到b过渡的值。
- 需要第三方变量存储c到b过渡的值。
-
输入一个数,到这个数之前的数,的前两个数列之和是多少?
#include <iostream> using namespace std; int main(){ //声明变量,a,b,c,任意数 num int a=1,b=1,c,num; cin >> num ; //1.如果num 为 1或者2 if (num==1 || num==2){ cout << 1; return 0; //结束返回即可 } //2.大于3的话 for (int i=3;i<=num;i++){ //2.1 进行交换,向后移动一位. c = a+b; int temp = b; b = c; a = temp; } cout << c <<endl; return 0; }
3. 循环算法扩展
3.1 质数(素数)
- 需求: 输入一个数,判断该数是否为质数,是输出 “yes” ,不是输出 “no” 。
- 分析: 什么是质数 ? 质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。又称为素数,
- 注意:1不属于质数。
-
代码如何判断
- 思路分析: 换句话说,只要在 2 到 n-1之间 有除数就不是一个质数。
- 当找到了其他因数就跳出程序, 关键字,break的使用。
#include <iostream> using namespace std; int main(){ // 1.就需要使用枚举法将所有符合. //只要循环范围在 2 和 n-1之间就可以.(1和本身) int n; cin >> n; //设置一个标志标量,提示信息 bool flag = true; // true 是的意思 , false 不是质数 //2.循环的目的就是看看能不能找到. for (int i =2;i<=n-1;i++){ //2.1 枚举判断 if (n%i==0){ flag = false; //不是质数 break; //找到就结束,增加效率 } } //3根据标识变量判断 if (flag == true){ cout << "是质数"; } else { cout << "不是质数"; } return 0; }
- 思路分析: 换句话说,只要在 2 到 n-1之间 有除数就不是一个质数。
3.2 质数统计(在3.1基础上扩展)
- 输入两个整数 n 和 m 请输出[n,m] 内所有的素数。
- 例如,输入 1 和 20 , 其中需要列出1~20之间所有质数。
- 如何分析:
- 首先:通过循环输出区间值。
- 其次:模块化 质数。
- 最后:标志变量,判断输出。
#include <iostream> using namespace std; int main(){ //1.获取区间值,定义变量 int n,m; cin >> n >>m; //2.循环变量 for(int i=n; i<=m;i++){ //cout << i << endl;//循环体 //2.2 设置标志变量 bool falg = true; //模块化;核心语法: 从2开始 n-1结束. //2.1 排除 数字 1 if (i==1) { falg = false; } for (int j = 2;j<=i-1;j++){ //2.2 判断是否有因数 if(i%j==0){ falg=false; break; //如果是跳出 } } if(falg == true){ cout<< i << endl; } } return 0; }
3.3 回文数
- 什么是回文数? 首先理解回文,指正着读,倒着读,都能通的句子,在数学中也一样。
- 12321,12344321,999。
#include <iostream> using namespace std; int main(){ //位数分离 int n,n1,g,rvs=0; cin >> n; n1=n; while(n!=0){ //123 g = n%10; //获取各位 //反转 rvs = rvs*10+g; n = n/10; //去掉一位. } if(n1==rvs){ cout << "yes"; } else{ cout << "no"; } return 0; }
4. 嵌套循环
4.1 什么是嵌套循环
- 在一个循环语句中包含另一个循环结构,这样的结构称之为嵌套循环,以下为核心语法:
- 外层循环控制行数。
- 内存循环控制列数。
- 案例如下:
#include <iostream>
using namespace std;
int main(){
//1.嵌套循环结构.
for (int i =1;i<=10;i++){ //外层循环,控制行.
for (int j = 1; j<=10;j++){//内层循环,控制列.
cout << "*";
}
//换行
cout<< endl;
}
return 0;
}
- 总结:外层循环循环一次,内层循环全部。
4.2 打印直角三角形
-
使用星号打印出直角三角形,如下图:
* ** *** **** *****
-
认真思考,分析上述:
- 打印几行?
- 每行打印几次?
- 行和列存在什么关系?
#include <iostream> using namespace std; int main(){ //1.思考外层循环和内层循环建立联系 for (int i =1;i<=5;i++){ //外层循环打印5行 for (int j = 1; j<=i;j++){ cout << "*"; } //换行 cout<< endl; } return 0; }
4.3 打印等腰三角形
-
使用星号打印等腰三角形,如下图:
- 输入 5,打印下图
* *** ***** ******* *********
-
认真思考,分析上述:
- 打印几行?
- 每行打印几次?怎么组合内循环。
- 行和列存在什么关系?
- 需要几个循环?
#include <iostream> using namespace std; int main(){ int n; cin >>n; for (int i =1;i<=n;i++){//外层循环控制行数 //1.第一行相当于倒着输出 n=5时, 第一行为 n-i for (int j = 1; j<=n-i;j++){ //注意范围时 n-i cout << " "; } //2. *打印的是 1 3 5 7 9 2*i-1(奇数) for(int z =1; z<=2*i-1; z++){ cout<<"*"; } //每打印一行 就需要换行 cout<<endl; } return 0; }
4.4 打印99乘法表
- 数学启蒙阶段都学了这样一道题,学习99乘法表,在编程中如何实现打印99乘法表。
- 提示:参考4.2 案例,打印直角三角形。
#include <iostream>
using namespace std;
int main(){
//外层循打印行,打印9行
for(int i = 1;i<=9;i++){
//内层循环打印列数,需要外层循环保持一致
for(int j =1;j<=i;j++){
//拼接循环体
cout << i<<"*"<<j<<"="<<i*j<<" ";
}
//换行
cout<<endl;
}
return 0;
}
5. 知识扩展
5.1 枚举法
- 什么是枚举法 ?
5.1.1 百钱买百鸡
- 需求如下图:
- 认真思考,分析上述:
- 首先,确定枚举对象。
- 其次,确定枚举范围。
- 最后,分析判断条件。
#include <iostream>
using namespace std;
int main(){
//1.使用枚举法解决问题
//1.1 公鸡的数量 100元 0-20只 5元一只
for (int i=0;i<=20;i++){
//cout <<i<<endl; //0~20只公鸡
//1.2 母鸡100元 0-33只 3元一只
for (int j =0;j<=33;j++){
//1.3 小鸡100元 , 0-300只. 1元3只,只能3只3只买
for (int z = 0;z<=300;z=z+3){//间隔3,6,9
//2.进行判断
if(i+j+z==100&&5*i+3*j+z/3==100){
cout<< i <<" " <<j <<" "<< z <<endl;
}
}
}
}
return 0;
}
- 上述问题,可以优化么? 存在什么漏洞?
- 可能存在超时,所以需要优化。
#include <iostream>
using namespace std;
int main(){
//1.使用枚举法解决问题
//1.1 公鸡的数量 100元 0-20只 5元一只
for (int i=0;i<=20;i++){
//cout <<i<<endl; //0~20只公鸡
//1.2 母鸡100元 0-33只 3元一只
for (int j =0;j<=33;j++){
//1.3 小鸡100元 , 0-300只. 1元3只,只能3只3只买
int z = 100-i-j;
if(5*i+3*j+z/3==100&&z%3==0){
cout<< i <<" " <<j <<" "<< z <<endl;
}
}
}
return 0;
}
5.1.2 枚举应用–无重复事项
- 使用 : 利用
0,1,2, 3
,这四个数字组合成 “无重复” 的三位数 问有多少组合方式。- 无重复。
#include <iostream> using namespace std; int main(){ /** 0 1 2 3 分析: 组成一个三位数. 0 不能开头 循环范围 1 2 3 for(int i=1; i<=3;i++) 第二位可以是 0 1 2 3 for(int j =0; j<=3; j++) 第三位可以是 0 1 2 3 for(int j =0; j<=3; j++) 最后判断范围 if("")判断 */ for(int i =1; i<=3;i++){ //第一位 只能是 1, 2, 3 //第二位,可以是 0 1 2 3 for (int j =0;j<=3;j++){ //第三位可以是 0 1 2 3 for (int z = 0 ; z<=3;z++){ //进行判断,不能重复,所以需要判断. if(i!=j&&j!=z&&i!=z) cout << i << j << z << " "; } } } return 0; }
102 103 120 123 130 132 201 203 210 213 230 231 301 302 310 312 320 321