当前位置: 首页 > news >正文

第五节 C++ 循环结构(算法)

文章目录

  • 前言介绍
  • 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 枚举应用--无重复事项

前言介绍

  1. C++中支持的三种基本的运行流程:顺序结构,选择结构,循环结构(本节课内容)
  2. 生活中经常遇到一些 重复性工作,这些反复执行多次同样的操作,将书包里的十本书,摆放到书架的指定位置上,要做的工作就是重复十次:拿起书→找位置→摆好书。每次只考虑拿一本的话,就会重复十次 ,就是循环思想。 用循环思想编写程序就是所谓的 循环结构程序。
    • 打印书籍。
    • 切黄瓜。
    • 操场跑圈。
  3. 在C++中,为了表现循环思想提供了,三种循环,for ,while,do-while 三种不同格式的循环语句。
    • 上述提到的:拿起书→找位置→摆好书。 这个重复内容,就是循环语句的循环体。

1. for 语句

1.1 语法结构

  1. 为什么要学习循环,怎么去理解循环? 先看一个下面的案例。

    • 输出 好好学习天天,天天向上。1000次! 怎么设计程序。
      在这里插入图片描述
    • 如果一次一次用手写,那可真是太秀了。
    #include <iostream>
    using namespace std;int main(){//1.输出1000次我爱学习cout<<"好好学习天天,天天向上"<<endl; cout<<"好好学习天天,天天向上"<<endl; cout<<"好好学习天天,天天向上"<<endl; cout<<"好好学习天天,天天向上"<<endl; //.....太麻烦了...?//2.怎么有更好的办法解决问题? return 0;
    } 
    
  2. 语法结构,关键字 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 语法流程的执行过程

  1. 语法循环控制流程:

    	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. 如何输入一个数,正序输出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的平方数

  1. 对于给定的任意正整数 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区间数.

  1. 在控制台中,同一行输入两个数 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 求最大值与最小值

  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 计算奇数和和偶数和

  1. 输入一个数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 计算平均气温与最高气温

  1. 某市七月份中旬温度如下:

    • 36.3,37.0,34.8,35.0,36.1,34.4,33.9,34.8,35.5,35.7。 要求计算中旬的平均气温和高温天数(大于等于35度为高温天)。请设计程序,输入十天温度,输出平均气温(保留2位小数)和高温天数。
    • 要求:第一行输入10个数字;
    • 输出:两个数字,第一个数字为高温天数,第二个数字是平均气温。
  2. 输入样例如下:

    • 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 计算阶乘

  1. 利用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*nfor(int i =1;i<=n;i++){sum_i *= i;  //5!= 1*2*3*4*5} cout << sum_i<<endl; return 0; 
    } 
    

1.3.5 计算 正常血压

  1. 问题描述: 监护室每小时测量一次病人的血压,若收缩压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  ...直到余数为12.假设这个数初始值为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

  1. 中断所在的循环体,跳出本层循环。

    • 注意: 跳出最近的一层循环,并不能跳出所有循环。
    #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

  1. 跳出当前循环,执行下一次循环。
    • 注意: 同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 语法结构

  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. 流程图如下:
    在这里插入图片描述

2.1.1 使用案例(Noip普及试题)

  1. 考试结束后,老师想计算全体学生的 平均分, 不知道考试人数具体是多少,直到考试参加人数成绩都不是0分。

    • 提供若干个考试成绩,输入0分的就结束,计算平均值。
    • 并且 保留2位小数
  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 注意三要素,避免死循环产生

  1. 什么是无限循环 ?什么情况下会产生无限循环?
    • 举一个例子: 操场跑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 语法流程的执行过程

  1. while循环的循环流程是什么样的 ?

    • 可以对比for循环流程学习。
    • 我们拿写作业这件事举例子。
    	条件是否成立{我一定要做的事情}
    

    在这里插入图片描述

    在这里插入图片描述

  2. 案例代码实现:

    • 根据流程执行过程,需要根据循环条件决定。
    • 重复的事情: 做作业。
    • 循环条件: 是否完成作业。
      在这里插入图片描述
    #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. 打印输出 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: 判断输入数,是几位数

  1. 需求:任意输入一个数字,输出这个数字是一个几位数。
    • 例如: 输入 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 银行取款输入密码

  1. 在银行取款时,需要输入密码(密码三位数),密码正确才可以进行取款操作;如果连续三次输入密码错误,就会提示错误信息,并且冻结账户。
    • 给出错误提示信息, 正确,错误,冻结。
  2. 分析思路:
    • 首先需要预设密码,然后在输入密码,和 输入次数。
    • 重复做的事,是什么? 循环条件是什么?
    #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 欧几里德算法(最大公约数)

  1. 又称为,辗转相除法,属于一个数学技巧。

    • 对于任意两个自然数 a 和 b ,求他们的最大公约数。
  2. 分析具体做法:

    • 分析两个数,需要两个数。
    • 案例如下:
      在这里插入图片描述
    #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,1,2,3,5,8,13,21,34,55,89…
    • 这个 数列从第3项开始,每一项都等于前两项之和。
    • 思考下面的枚举方式是否可行?为什么?在这里插入图片描述
  2. 如何解决上述问题。

    • 需要第三方变量存储c到b过渡的值。
      在这里插入图片描述
  3. 输入一个数,到这个数之前的数,的前两个数列之和是多少?

    #include <iostream>
    using namespace std;int main(){//声明变量,a,b,c,任意数 num int a=1,b=1,c,num;cin >> num ;//1.如果num 为 1或者2if (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 质数(素数)

  1. 需求: 输入一个数,判断该数是否为质数,是输出 “yes” ,不是输出 “no”
    • 分析: 什么是质数 ? 质数是指在大于1的自然数中,除了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;
    }

3.2 质数统计(在3.1基础上扩展)

  1. 输入两个整数 n 和 m 请输出[n,m] 内所有的素数。
    • 例如,输入 1 和 20 , 其中需要列出1~20之间所有质数。
  2. 如何分析:
    • 首先:通过循环输出区间值。
    • 其次:模块化 质数。
    • 最后:标志变量,判断输出。
    #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 回文数

  1. 什么是回文数? 首先理解回文,指正着读,倒着读,都能通的句子,在数学中也一样。
    • 12321,12344321,999。
    #include <iostream>
    using namespace std;int main(){//位数分离int n,n1,g,rvs=0;cin >> n;n1=n;while(n!=0){ //123g = n%10; //获取各位 //反转rvs = rvs*10+g; n = n/10;	//去掉一位. } if(n1==rvs){cout << "yes";} else{cout << "no";}return 0;
    }

4. 嵌套循环

4.1 什么是嵌套循环

  1. 在一个循环语句中包含另一个循环结构,这样的结构称之为嵌套循环,以下为核心语法:
    • 外层循环控制行数。
    • 内存循环控制列数。
  2. 案例如下:
    在这里插入图片描述
#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 打印直角三角形

  1. 使用星号打印出直角三角形,如下图:

    *
    **
    ***
    ****
    *****
    
  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 打印等腰三角形

  1. 使用星号打印等腰三角形,如下图:

    • 输入 5,打印下图
    	****************
    *********
    
  2. 认真思考,分析上述:

    • 打印几行?
    • 每行打印几次?怎么组合内循环。
    • 行和列存在什么关系?
    • 需要几个循环?
    #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乘法表

  1. 数学启蒙阶段都学了这样一道题,学习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 枚举法

  1. 什么是枚举法 ?
    在这里插入图片描述

5.1.1 百钱买百鸡

  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;
}
  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只买 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 枚举应用–无重复事项

  1. 使用 : 利用 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 3for (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

相关文章:

第五节 C++ 循环结构(算法)

文章目录 前言介绍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 计算平均气温与最高气…...

接口与抽象类的区别

a、抽象类不能被实例化只能被继承&#xff1b;b、包含抽象方法的一定是抽象类&#xff0c;但是抽象类不一定含有抽象方法&#xff1b;c、抽象类中的抽象方法的修饰符只能为public或者protected&#xff0c;默认为public&#xff1b;d、一个子类继承一个抽象类&#xff0c;则子类…...

短视频账号矩阵系统源码saas===独立部署

前言&#xff1a; 短视频账号矩阵是指在不同的短视频平台上&#xff0c;一个个人或企业所拥有的账号数量和分布情况。由于不同的短视频平台受众人群和内容类型等因素不同&#xff0c;因此拥有更多账号可以在更广泛的受众中传播内容&#xff0c;提高曝光度和流量。短视频账号矩阵…...

香港专用服务器拥有良好的国际网络连接

香港服务器在多个领域有着广泛的应用。无论是电子商务、金融交易、游戏娱乐还是社交媒体等&#xff0c;香港服务器都能够提供高效稳定的服务。对于跨境电商来说&#xff0c;搭建香港服务器可以更好地满足亚洲用户的购物需求&#xff1b;对于金融机构来说&#xff0c;香港服务器…...

IP/SIP网络有源吸顶喇叭 20W扬声器 可供POE供电

IP/SIP网络有源吸顶喇叭 20W扬声器 可供POE供电 深圳锐科达SV-7043VP 20W网络有源吸顶喇叭。该设备配备了10/100M以太网接口&#xff0c;内置了高品质扬声器&#xff0c;通过内置的功放和喇叭输出&#xff0c;可提供高达20W的音效功率。SV-7043VP作为SIP系统的播放终端&#…...

基于Keil a51汇编 —— 程序模板文件以及规则

程序模板文件 下面的代码模板包含有关如何编写自己的程序集模块的指南和提示。此模板文件模板。A51 在文件夹 \C51\ASM 中提供。 $NOMOD51 ; 禁用预定义的 8051 寄存器 #include <reg52.h> // 包含头文件; ;根据需要更改小写名称。 ;该汇编模板让你…...

案例研究 | 玉湖冷链基于JumpServer实现管理安全一体化

玉湖冷链&#xff08;中国&#xff09;有限公司&#xff08;以下简称为玉湖冷链&#xff09;是玉湖集团旗下的冷链食品供应链企业。依托自有的国际高标数智化冷链园区产业集群&#xff0c;玉湖冷链提供一站式国内外代采、仓干配物流解决方案、全链路创新金融支持、高品质生活办…...

JavaEE初阶学习:HTTP协议和Tomcat

1. HTTP协议 HTTP协议是一个非常广泛的应用层协议~~ 应用层协议 —> TCP IP 协议栈 应用层 —> 关注数据怎么使用~ 传输层 —> 关注的是整个传输的起点和终点 网络层 —> 地址管理 路由选择 数据链路层 —> 相邻节点之间的数据转发 物理层 —> 基础设置,硬…...

ASEMI整流桥GBU810参数,GBU810封装

编辑-Z GBU810参数描述&#xff1a; 型号&#xff1a;GBU810 最大直流反向电压VR&#xff1a;1000V 最大工作峰值反向电压VRWM&#xff1a;700V 最大平均正向电流IF&#xff1a;8A 非重复正向浪涌电流IFSM&#xff1a;200A 操作和储存温度范围TJ ,TSTG&#xff1a;-55 t…...

docker应用记录总结

一、前言 docker这类部署工具&#xff0c;久而久之不使用非常容易忘记&#xff0c;甚至连操作命令都容易忘记。网上也有比较全的docker使用教程。这里做一个记录总结&#xff0c;纯属是温故知新。 二、docker部署应用 1、docker印象 docker首先让我想到的是是虚拟化技术&…...

Jenkins 添加节点Node报错JNI error has occurred UnsupportedClassVersionError

节点日志 报错信息如下 Error: A JNI error has occurred, please check your installation and try again Exception in thread “main” java.lang.UnsupportedClassVersionError: hudson/remoting/Launcher has been compiled by a more recent version of the Java Runtime…...

swift ui 布局 ——Stack(HStack、VStack、ZStack)

一、HStack 水平布局 将其子视图排列在水平线上 import Foundation import SwiftUI struct MyView: View {var body: some View {HStack{Text("text")Image("yuyin").resizable().frame(width: 102,height: 80)}} } 默认子视图是水平中心对齐的,可添加al…...

淘宝天猫商品评论数据接口,淘宝天猫商品评论API接口,淘宝API

淘宝商品评论数据接口可以通过淘宝开放平台API获取。 通过构建合理的请求URL&#xff0c;可以向淘宝服务器发起HTTP请求&#xff0c;获取商品评论数据。接口返回的数据一般为JSON格式&#xff0c;包含了商品的各种评价信息。获取到商品评论数据后&#xff0c;可以对其进行处理…...

C# Onnx GFPGAN GPEN-BFR 人像修复

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms;namespace 图像修复 {public partial class Form1 : For…...

ubuntu安装依赖包时显示需要先安装其所需要的各种安装包)apt-get源有问题

最近在崭新的ubuntu上安装g以及一些其他的依赖与工具时遇到以下报错情况&#xff1a; 依赖环环相扣&#xff0c;手动无法解决。 总结&#xff1a; 出现需要很多依赖项的情况是因为软件源中没有可用的依赖项或者依赖项版本不正确。 其实在Ubuntu系统中&#xff0c;使用sudo…...

C/C++之自定义类型(结构体,位段,联合体,枚举)详解

个人主页&#xff1a;点我进入主页 专栏分类&#xff1a;C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 欢迎大家点赞&#xff0c;评论&#xff0c;收藏。 一起努力&#xff0c;一起奔赴大厂。 目录 个人主页&#xff1a;点我进入主页 …...

HBase 表如何按照某表字段排序后顺序存储的方法?

首先需要明白HBase表的排序规则&#xff1a; &#xff08;1&#xff09;rowkey排序&#xff08;字典排序&#xff09;——升序 &#xff08;2&#xff09;Column排序&#xff08;字典排序&#xff09;——升序 &#xff08;3&#xff09;时间戳排序——降序 rowkey 字典序排序…...

webrtc用clang编译支持h264,支持msvc调用库

webrtc遇到困扰&#xff1a; 如果msvc编译&#xff0c;ffmpeg编译失败&#xff0c;需要替换ffmpeg库。如果用clang编译&#xff0c;vs或qt调用dll又存在崩溃。 经过反复尝试找到解决方法&#xff1a; 一、编译 1、编译参数 //我得环境配置 set DEPOT_TOOLS_UPDATE0 set DEP…...

迁移学习是什么?

迁移学习&#xff08;Transfer Learning&#xff09;是一种机器学习方法&#xff0c;它的主要思想是将已经在一个任务上学到的知识迁移到另一个相关或不相关的任务上&#xff0c;以提高目标任务的性能。迁移学习的核心概念是&#xff0c;模型可以通过先前学到的知识来更好地解决…...

哈希的应用--位图和布隆过滤器

哈希的应用--位图和布隆过滤器 位图1. 位图概念2. 位图在实际中的应用3. 位图相似应用给定100亿个整数&#xff0c;如何找到只出现一次的整数&#xff1f;1个文件100亿int&#xff0c;1G内存&#xff0c;如何找到不超过2次的所有整数 布隆过滤器1. 布隆过滤器的提出2. 布隆过滤…...

mac M2芯片在使用Android studio 编译问题bad cpu type in executable android

由于mac的intel芯片的一些指令集没有同步在M1 M2芯片上所以需要做兼容 打开控制台&#xff08;通过访达 - 应用程序 - 实用工具 - 终端 &#xff09; 输入 softwareupdate --install-rosetta 之后在输入 A 就可以了。 原产考地址&#xff1a;硬核&#xff01;在 M1 芯…...

M4Singer ubuntu 22.04 4060ti16g ModuleNotFoundError: No module named ‘gradio‘

故障 Traceback (most recent call last): File "inference/m4singer/gradio/infer.py", line 4, in <module> import gradio as gr ModuleNotFoundError: No module named gradio 解决 (venv3712) (base) yeqiangyeqiang-Default-string:~/Downloa…...

postman 密码rsa加密登录-2加密密码

上一篇讲了获取公钥&#xff0c;将环境准备好之后&#xff0c;在登录接口的Pre-request Scrip 里&#xff0c;使用公钥进行加密后在正常登录。本文采用的方案是使用第三方模块forge.js来实现加密。 1、环境准备好&#xff0c;系统git 和node都OK。下载forge.js git clone htt…...

如何去图片水印?这些方法解决你的问题

当我们希望更新自己的头像时&#xff0c;经常会发现网上有许多精彩的图片&#xff0c;但它们通常带有水印&#xff0c;使我们无法轻松使用这些照片。这个情况大家应该都有遇到过吧&#xff1f;那么&#xff0c;如何去除图片上的水印呢&#xff1f;接下来&#xff0c;我们将分享…...

Qt通过正则表达式筛选出字符串中的手机号

需求 用户需要聊天记录中含有11位的手机号码进行提醒的功能&#xff0c;所以需要在收到聊天消息后匹配查看是否存在手机号。如果找到然后提醒。 分析 主要的需求可以拆分为两点&#xff1a; 筛选出字符串里面的数字字符。通过正则匹配数字字符是否是11位手机号码。 一开始没…...

【Pytorch】深度学习之数据读取

数据读入流程 使用DatasetDataLoader完成Pytorch中数据读入 Dataset定义数据格式和数据变换形式 DataLoader用iterative的方式不断读入批次数据&#xff0c;实现将数据集分为小批量进行训练 使用PyTorch自带数据集 使用Dataset完成数据格式和数据变换的定义 import torch fro…...

Maven教程

Maven介绍 Maven 环境配置 Maven Pom Maven 构建生命周期 Maven 构建配置文件 Maven 插件 Maven 仓库 Maven 构建Java项目 Maven 构建&项目测试 Maven 引入外部依赖 Maven 项目模板 Maven 项目文档 Maven 快照(SNAPSHOT) Maven 自动化构建 Maven 依…...

一篇带你看懂异步:promise、async await

在前端开发中&#xff0c;特别是使用Vue.js框架时&#xff0c;Promises&#xff08;承诺&#xff09;和resolve是与异步操作相关的重要概念。让我来解释一下它们的含义和如何在Vue.js中使用它们。 一、Promise 1. Promise&#xff08;承诺&#xff09;: Promise是一种处理异…...

RocketMQ快速实战以及集群架构详解

文章目录 一、MQ简介二、RocketMQ产品特点RocketMQ介绍RocketMQ特点 三、RocketMQ快速实战快速实现消息收发命令行快速实现消息收发搭建Maven客户端项目 搭建RocketMQ可视化管理服务 四、升级分布式集群五、升级高可用集群六、总结RocketMQ的运行架构七、理解RocketMQ的消息模型…...

京东运营数据分析:2023年8月京东饮料行业品牌销售排行榜

鲸参谋监测的京东平台8月份饮料市场销售数据已出炉&#xff01; 8月份&#xff0c;饮料市场整体销售下滑。根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;今年8月&#xff0c;京东平台饮料市场的总销量将近820万&#xff0c;环比下滑约8%&#xff0c;同比下滑约20%&am…...