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

蓝桥备赛(三)- 条件判断与循环(下)

一、for循环

1.1  for 循环语法形式

for 循环是三种循环中使用最多的 , for 循环的语法形式如下:

1.2 执行流程

for 循环中 , 表达式1(初始化)只执行一次 !

1.3 实践

练习:使用 for 循环在屏幕上打印1~10的值
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
	int i = 0;
	for(i = 1;i<=10;i++)
	{
		cout << i << " ";
	}
	return 0;
}

1.4 while 和 for 对比

for 和 while 在实现循环的过程中都有初始化 、 判断 、 调整这三个部分 , 但是 for 循环的三个部分非常集中 , 便于代码的维护 , 而如果代码较多的时候 while 循环的三个部分就比较分散 , 所以 从形式上 for 循环要更优一些 。 

1.5 练习

练习一 : 求和2

计算1~100之间3的倍数的数字之和
思路 :
1 . 产生 1 ~100 的所有数字 --> for
2 . 判断是否是 3 的倍数  ------> if(i % 3 == 0)
3 . 如果是3的倍数,就求和 ---> sum +=i
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
	int i = 0;
	int sum = 0;
	for(i = 1 ;i<=100 ; i++)
	{
		if(i % 3 == 0)
			sum += i;
	}
	cout << sum << endl;
	return 0;
}

如果直接产生3的倍数 的数字 就省去了多余的循环和判断 

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
	int i = 0;
	int sum = 0;
	for(i = 3 ;i<=100 ; i+= 3)
	{
			sum += i;
	}
	cout << sum << endl;
	return 0;
}

两个方法相比 , 第二个较优一些 , 执行的次数比代码一少! 

练习二 : 求平均年龄

B2054 求平均年龄 - 洛谷

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
	int n = 0;
	cin >> n;
	int age = 0;
	int sum = 0;
	for(int i = 1 ;i <= n ; i++)
	{
		cin >> age;
		sum +=  age;
	}
	printf("%.2lf\n",sum*1.0/n);
	return 0;
}

练习三 : 奥运奖牌计数

B2058 奥运奖牌计数 - 洛谷

#include <iostream>
#include <cstdio>
using namespace std;

int a, b , c ;//每一天的奖牌数 
int p1, p2, p3;
int sum;
int main()
{
	int n = 0;
	cin >> n;
	for(int i = 1 ; i<= n ; i++)
	{
		//读取每一天的奖牌数
		cin >> a >> b >> c;
		p1 += a;
		p2 += b;
		p3 += c;
	} 
	sum = p1 + p2 + p3;
	cout << p1 << " " << p2 << " " << p3 << " " <<  sum << endl;
	return 0;
}

练习四 : 鸡尾酒疗法

B2065 鸡尾酒疗法 - 洛谷

#include <iostream>
#include <cstdio>
using namespace std;

int a,b; //a:总病例数 b:有效病例数 
float x,y; //x:鸡尾酒疗法有效率 y:改进后的 
int main()
{
	int n = 0;
	//1.输入n 
	cin >> n;
	//2.读取第一组数据 
	cin >> a >> b;
	x = b*1.0 / a;
	//3.读取 n - 1 组的对照组数据
	for(int i = 1;i <= n-1 ; i++)
	{
		cin >> a >> b;
		y = b * 1.0 / a;
		if(y - x > 0.05)
			cout << "better" << endl;
		else if(x - y > 0.05)
			cout << "worse" << endl;
		else
			cout << "same" << endl;	
	} 
	return 0;
}

练习五 :救援

B2066 救援 - 洛谷

在解决问题之前 , 先了解一下两个库函数ceil 和 floor 函数 : 

ceil : 对于一个浮点数向上取整 , 需要头文件 <cmath>

ceil - C++ Reference

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

int main()
{
	cout << ceil(2.3) << endl;
	cout << ceil(3.8) << endl;	
	cout << ceil(-2.3) << endl;
	cout << ceil(-3.8) << endl;
	return 0;
}

floor : 对一个浮点数向下取整 , 需要头文件 <cmath>

floor - C++ Reference

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

int main()
{
	cout << floor(2.3) << endl;
	cout << floor(3.8) << endl;	
	cout << floor(-2.3) << endl;
	cout << floor(-3.8) << endl;
	return 0;
}

解题思路:

1 . 输入n

2. 循环 n 次

           每次处理一个屋顶 (计算举例,计算时间,时间累加)

3. 输出时间 --> 向上取整

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

int p;
int n;
double x,y;
int main()
{
	cin >> n;
	double t = 0;
	for(int i = 0 ; i< n ;i++)
	{
		cin >> x >> y >> p;
		float dis = sqrt(x*x + y*y);
		t += p*1 + dis/50 + p*0.5 + dis/50;
	}
	cout << (int)ceil(t) << endl;
	return 0;
}

练习六 :计算分数加减表达式的值

B2070 计算分数加减表达式的值 - 洛谷

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
	int n = 0;
	double sn = 0;
	int flag = 1;
	cin >> n;
	for(int i = 1;i<=n ; i++)
	{
		sn += flag * 1.0 / i;
		flag = -flag;
	}
	printf("%.4f\n",sn);
	return 0;
}

还可以使用库函数 pow 函数 ---> pow(x,y) ,x的y次方 , 需要包含头文件<cmath> 

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

int main()
{
	int n = 0;
	double sn = 0;
	cin >> n;
	for(int i = 1;i<=n ; i++)
	{
		sn += pow(-1,i-1) * 1.0 / i;
	}
	printf("%.4f\n",sn);
	return 0;
}

 还有一种方法 , 可以通过判断奇偶  来决定 sn是+= 还是-=

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

int main()
{
	int n = 0;
	double sn = 0;
	cin >> n;
	for(int i = 1;i<=n ; i++)
	{
		if(i%2)
			sn += 1.0 / i;
		else
			sn -= 1.0 / i;	 
	}
	printf("%.4f\n",sn);
	return 0;
}

练习七 :求分数序列和

B2069 求分数序列和 - 洛谷

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
	int n;
	double sum = 0;
	double p = 1;
	double q = 2;
	cin >> n;
	for(int i = 1 ; i<=n;i++)
	{
		//1.产生1项 累计求和 
		sum += q / p;
		//2.为下一项准备 p 和 q
		q = q + p; 
		p = q - p;
	}
	printf("%.4lf\n",sum);
	return 0;
}

二、do-while 循环

2.1 do-while语法形式

在循环语句中 , do while 语句的使用最少 , 它的语法如下 : 

 1. while 和 for 这两种循环都是先判断,条件如果满足就进入循环,执行循环语句,如果不满足就跳 出循环;

2. do while 循环则是 先直接进入循环体,执行循环语句 ,然后再执行  while 后的判断表达式,表达式为真,就会进行下⼀次,表达式为假,则不再继续循环。

2.2 执行流程

2.3 实践

使用 do while 循环在屏幕上打印1~10的值
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
	int i = 1;
	do
	{
		cout << i << " ";
		i++;
	}
	while(i <= 10);
	return 0;
}

2.4 练习

练习一 : 统计正整数的位数

输入一个正整数,计算这个整数是几位数?
例如:
输入:1234 输出:4
输入:12 输出:2
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
	int n = 0;
	cin >> n;
	int c = 0;
	do
	{
		c++;
		n/=10;
	}while(n);
	cout << c << endl;
	return 0;
}

这里并非必须使用 do while 语句 , 但是这个代码就比较适合使用 do while 循环 , 因为即使 n 是 0 , 也是 1 位数 , 需要统计位数。

以上的代码 , c 每 ++ , n 就删掉一位数(n % 10) 

练习二 :球弹跳高度的计算

B2076 球弹跳高度的计算 - 洛谷

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
	double h;
	cin >> h;
	double sum = h;
	int i = 1;
	do
	{
		h/=2;
		sum += 2*h;
		i++;
	}while(i<=9);
	cout << sum << endl;
	cout << h/2 << endl;
	return 0;
}

三 、break 和 continue 语句

3.1 break 和 continue 介绍

1 . 在循环执行的过程中 , 如果某些状况发生的时候 , 需要提前终止循环 , 这是非常常见的现象 。 C++ 中提供了break 和 continue 两个关键字 ,就是应该到循环中 。

2 . break 的作用是用于永久的终止循环 , 只要break 被执行 , 直接就会跳出循环 , 继续往后执行 。

3 . continue 的作用是跳出本次循环 continue 后边的代码 , 在 for 循环和 while 循环中 有所差异 。

4 . 注意break 和 continue 在各循环语句中的使用方式基本相同 , 这里仅以while 循环举例。 

3.2 break 举例

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
	int i = 1;
	while(i <= 10)
	{
		if(i == 5)
			break;
		cout << i << " ";
		i++;
	}
	return 0;
}

3.3 continue 举例

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
	int i = 1;
	while(i <= 10)
	{
		if(i == 5)
			continue;
		cout << i << " ";
		i++;
	}
	return 0;
}

如果在for 循环中使用continue 呢 ?

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
	int i = 0;
	for(i = 1;i<=10 ; i++)
	{
		if(i == 5)
			continue;
		cout<< i << " ";
	}
	return 0;
}

这时候的 continue 在 while 循环和 for 循环中略有差异!!!

3.4 练习:质因数分解

B2084 质因数分解 - 洛谷

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
	int n;
	cin >> n;
	for(int i = 2;i < n ; i++)
	{
		//找能整除的最小因数 
		if(n % i == 0)
		{
			cout << n / i << endl;
			break;
		}
	}
	return 0;
}

四、循环嵌套

4.1 循环嵌套的使用

前面我们学习了三种循环 : while , do while , for , 这三种循环往往会嵌套在一起才能更好解决问题 , 就是我们所说的 : 循环嵌套 。 这三种循环都可以任意嵌套使用

 比如 : 打印一个乘法口诀表

观察后 : 我们发现 每一项就是 ---> 列 * 行 = 乘积

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
	for(int i = 1;i <=9 ; i++)
	{
		for(int j = 1 ; j <= i ;j++)
		{
			printf("%d*%d=%2d ",i,j,i*j);
		}
		printf("\n");
	}
	return 0;
} 

4.2 练习

练习一:乘法表

登录—专业IT笔试面试备考平台_牛客网

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
	for(int i = 1;i <=9 ; i++)
	{
		for(int j = 1 ; j <= i ;j++)
		{
			printf("%d*%d=%2d ",j,i,i*j);
		}
		printf("\n");
	}
	return 0;
} 

练习二:包含数字9的数

包含数字9的数_牛客题霸_牛客网

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
	int c = 0;
	for(int i = 1 ; i<= 2019 ; i++)
	{
		//判断i是否包含9
		//把i的每一位都拆出来
		int n = i;
		while(n)
		{
			if(n % 10 == 9)
			{
				c++;
				break;
			}
			n /= 10;
		} 
	}
	cout << c << endl;
	return 0;
}

注意 : 在多层嵌套的循环中也可以使用 break , 但是要注意 , 一个break 只能跳出自己所在的循环 , 无法一次性跳出所有的循环 。 

练习三:斐波那契数列

B2064 斐波那契数列 - 洛谷

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
	int n;
	cin >> n;
	int a = 0;
	while(n--)//n次询问
	{
		cin >> a;
		int x = 1;
		int y = 1;
		int z = 1;
		while(a > 2)
		{
			z = x + y ;
			x = y;
			y = z;
			a--;	
		}	
		cout << z << endl;
	} 
	return 0;
}

练习四:求出e的值

B2079 求出 e 的值 - 洛谷

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
	int n;
	cin >> n;
	double sum = 1;
	for(int i = 1;i<=n;i++)
	{
		//算出i的阶乘
		long long r = 1;
		for(int j=1;j<=i;j++)
		{
			r *= j;
		}
		sum += 1.0 / r; 
	}
	printf("%.10lf\n",sum);
	return 0;
}

优化 : 我们发现会有重复类乘的情况 ,比如求3! = 1*2*3 , 在算4! 的时候 又把 1*2*3 算了一遍 , 会有一点的时间消耗。

----> 计算阶乘的时候 , 是有连续性的 , 我们可以借助这个特点 , 对代码进行优化

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
	int n;
	cin >> n;
	double sum = 1;
	long long r = 1;
	for(int i = 1;i<=n;i++)
	{
		r *= i;
		sum += 1.0 / r; 
	}
	printf("%.10lf\n",sum);
	return 0;
}

练习五:三角形

信息学奥赛一本通(C++版)在线评测系统

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
	int n = 0;
	cin >> n;
	//输出n行 
	for(int i = 1 ; i<= n;i++)
	{
		//打印1行
		for(int j = 1 ; j <= i ; j++)
		{
			cout<< "*";	
		} 
		cout << endl;
	}
	return 0;
}

对于嵌套循环 , 一定要明白 , 每一个循环所对应的目标是什么 。 

练习六:画矩形

B2083 画矩形 - 洛谷

#include <iostream>
#include <cstdio>
using namespace std;

int a,b;
char c;
int f;
int main()
{
	cin >> a >> b >> c >> f;
 	if(f == 0)
 	{
		for(int i = 1;i<=a;i++)
		{
			//打印1行
			for(int j = 1;j<=b;j++)
			{
				if(i == 1 || i == a || j== 1 || j== b)
					cout << c;
				else
					cout << " ";	
			}	
			cout << endl;
		}	
	}
	else
	{
		//直接打印 a行b列的实心图形
		for(int i = 1;i<=a;i++)
		{
			//打印1行
			for(int j = 1;j<=b;j++)
			{
				cout << c;	
			}	
			cout << endl;
		}
	}
	return 0;
}

我们还可以对以上代码进行优化 : 

1 . 无论什么情况 , 第1行、第1列、第a行、第b列 都会打印c符

2 . 不同的是 , f为0时 , 中间的空格打印空字符  ,这里我们就可以用 else if ... else 语句来控制

#include <iostream>
#include <cstdio>
using namespace std;

int a,b;
char c;
int f;
int main()
{
	cin >> a >> b >> c >> f;
	for(int i = 1;i<=a;i++)
	{
		//打印1行
		for(int j = 1;j<=b;j++)
		{
			if(i == 1 || i == a || j== 1 || j== b)
				cout << c;
			else if(f == 0)
				cout << " ";
			else
				cout << c;	
		}	
		cout << endl;
	}
	return 0;
}

练习七:第n小的质数

B2085 第 n 小的质数 - 洛谷

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
	int n;
	cin >> n;
	int i = 2;
	int c = 0;
	while(1)
	{
		//判断i是否为素数
		int flag = 1;//假设i是素数
		for(int j = 2 ; j<= i-1;j++)
		{
			if(i % j == 0)
			{
				flag = 0;				
				break;	
			}
		}
		if(flag == 1)
			c++;
		if(c == n)
		{
			 break;	
		}
		 i++; 
	}
	cout << i << endl;
	return 0;
}

"Time Limit Exceeded"(TLE,超时)是⼀个在编程竞赛和在线评测平台(如LeetCode、
Codeforces、HackerRank等)中常见的错误信息。它意味着程序在执行过程中超过了给定的最大运行时间限制,而未能在规定时间内得出结果。

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

int main()
{
	int n = 0;
	cin >> n;
	int c = 0;
	int i = 2;
	while(1)
	{
		int flag = 1;
		//判断i是否是素数
		for(int j = 2;j <= sqrt(i) ;j++)
		{
			if(i % j == 0)
			{
				flag = 0;
				break;	
			}	
		}	
		if(flag == 1)
			c++;
		if( c == n)
		{
			break;
		}
		i++;
	} 
	cout << i << endl;
	return 0;
}

练习八 : 水仙花数

信息学奥赛一本通(C++版)在线评测系统

水仙花数 : 自幂数 --> 每个位上的数字的n次幂之和等于它本身

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;

int main()
{
	for(int i = 100 ; i<= 999 ; i++)
	{
		//判断i是否为水仙花数 
		int tmp = i;
		int r = 0;
		while(tmp)
		{
			r += pow(tmp % 10,3);			
			tmp /= 10;
		}
		if(r == i)
			cout << i << endl;
	}
	return 0;
}

http://www.kler.cn/a/565087.html

相关文章:

  • 算法仿真平台搭建1-FFMPEG+RtspSever快速搭建一个RTSP服务器
  • 去耦电容的作用详解
  • LlamaFactory-webui:训练大语言模型的入门级教程
  • IP离线库助力破解网络反诈难题
  • Deepseek的缺陷
  • (一)未来学习什么语言或相关的AI、数据库知识进行技术迭代提升?
  • 利用阿里云容器镜像服务创建免费的国内镜像节点
  • Linux实操——在服务器上直接从百度网盘下载(/上传)文件
  • 蓝桥杯好题推荐--多项式输出
  • 第6天:指针与内存管理
  • 【笔记】论文阅读方法(AI大模型)
  • 网络原理--UDP的特点
  • USBCANFD接口卡介绍
  • Python在实际工作中的运用-合并XLSX表格的新方法
  • vue3中ref和reactive响应式数据、ref模板引用(组合式和选项式区别)、组件ref的使用
  • 自动化问题汇总
  • XSS-labs靶场通关
  • Ollama下载安装+本地部署DeepSeek+UI可视化+搭建个人知识库——详解!(Windows版本)
  • MySQL分库分表之带来查询相关问题
  • springboot413-基于Java高校科技创新项目评审系统的设计与实现(源码+数据库+纯前后端分离+部署讲解等)