C++微基础备战蓝桥杯9.18-9.21

do-while 循环

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

//形式

do

语句;

while(exp);

形式2

do

{

语句1;

语句2

....

}

while(exp);

练习1:统计正整数的位数 输⼊⼀个正整数,计算这个整数是⼏位数?

例如: 输⼊:1234

输出:4

输⼊:12

输出:2

//任何一个数字,至少是1位数
//1 / 10 == 0 cnt++;
//0 / 10 == 8 cnt++
//do
//{}
//while()

#include <iostream>

using namespace std;

int main()
{
int n = 0;
int cnt = 0;
//统计位数
cin >> n;
do
{
n /= 10;
cnt++;
}while(n);
cout << cnt << endl;
return 0;
}

练习2(罗洛谷2076)

球弹跳高度的计算

一球从某一高度落下(整数,单位米),每次落地后反跳回原来高度的一半,再落下。

编程计算气球在第 10 次落地时,共经过多少米?第 10 次反弹多高?

输入格式

输入一个整数 h,表示球的初始高度。

输出格式

输出包含两行:

第 1 行:到球第 10 次落地时,一共经过的米数。

第 2 行:第 10 次弹跳的高度。

注意:结果可能是实数,结果用 double 类型保存。

提示:输出时不需要对精度特殊控制,用 cout<<ANSWER,或者 printf("%g",ANSWER) 即可。

#include <iostream>

using namespace std;

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

break和continue介绍

• 在循环执⾏的过程中,如果某些状况发⽣的时候,需要提前终⽌循环,这是⾮常常⻅的现象。 C++中提供了 break 和 continue 两个关键字,就是应该到循环中的。

• break 的作⽤是⽤于永久的终⽌循环,只要 break 被执⾏,直接就会跳出循环,继续往后执 ⾏。

• continue 的作⽤是跳过本次循环 continue 后边的代码,在 for 循环和 while 循环中有所 差异的。

注意: break 和 continue 在各个循环语句中的使⽤⽅式基本相同,这⾥仅以 while 循环举例。

cpp 复制代码
#include <iostream> 

using namespace std;

int main()
 {
    int i = 1;
    while (i <= 10)
    {
        if (i == 5)
        {

            break;         
 
        }
        cout << i << " ";
        i = i + 1;
    }
    return 0;
 }

break可以改成continue

质数因数分解

已知正整数 n 是两个不同的质数的乘积,试求出较大的那个质数。

输入格式

输入只有一行,包含一个正整数 n(6<n<109)。

输出格式

输出只有一行,包含一个正整数 p,即较大的那个质数。

B2084--洛谷

cpp 复制代码
//质数因数分解
 //质数--只能被1和他本身整除的数字 

//n = m1 * m2  m1! =m2!
//m1 m2是质数 

#include <iostream>

using namespace std;

int main()
{
	int n = 0;
	cin >> n; 
	//
	int i = 0;
	for(i = 2;i < n;i++)
	{
		if(n % i == 0)
		{
			cout << n / i << endl; 
			break;
		}
		
	}
	
	
	return 0;
 } 

打印乘法口诀表

1.我们⾸先研究⼀下这个打印的内容,我们发现打印的内容是分为9⾏的,第1⾏打印1项,第2⾏打印 2项,第3⾏打印3项,以此类推,第9⾏打印9项。

2.如果观察每⼀⾏的信息,也能找到⼀些规律每⼀项的第⼀个乘数和列号是⼀致的,每⼀项的第⼆个 乘数和⾏号是⼀致的,两个乘数的积就是第三个数。

3.打印9⾏,我们可以使⽤循环解决,总共循环9次,每次进⼊循环打印⼀⾏,循环变量使⽤ i 来控 制, i 从1开始,循环到9,

4.那怎么打印⼀⾏呢?第 i ⾏是有 i 项组成的,这 i 项的打印也可以写成循环来完成。使⽤循环变 量 j , j 从1开始,⼀致循环到 i ,正好循环 i 次,正好打印 i 项。同时每⼀⾏打印完后还要 换⾏。

5.还有⼀个细节值得注意,输出的效果中,i*j的结果如果是2位数,才有右对⻬,不够2位数的情况, 使⽤空格补⻬。所以这⾥就得使⽤ %2d 这样的输出格式控制了。

cpp 复制代码
//c乘法口诀表 
//每一项就是:列*行=乘积
 //for循环9次 
 

#include <iostream>

using namespace std;

int main()
{
	//行数问题
	for (int i = 1;i <= 9;i++)
	{
		//打印一行
		for(int j = 1;j <= i;j++)
		{
			//打印一项
			printf("%d*%d=%d ",j,i,j*i); 
		 } 
		 cout << endl;
		 //or)printf("\n");	 
    } 
	
	
	return 0;
 } 

1~2019有多少包含数字9的数

cpp 复制代码
//1~2019有多少个包含数字9的数 

#include <iostream>

using namespace std;

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

�⼩提⽰: 在多层嵌套的循环中也可以使⽤break,但是要注意,⼀个break只能跳出⾃⼰所在的循环, ⽆法⼀次性跳出所有的循环。

斐波那契数列

斐波那契数列是指这样的数列:数列的第一个和第二个数都为 1,接下来每个数都等于前面 2 个数之和。

给出一个正整数 a,要求斐波那契数列中第 a 个数是多少。

输入格式

第 1 行是测试数据的组数 n,后面跟着 n 行输入。每组测试数据占 1 行,包括一个正整数 a(1≤a≤30)。

输出格式

输出有 n 行,每行输出对应一个输入。输出应是一个正整数,为斐波那契数列中第 a 个数的大小

输入

4

5

2

19

1

输出

5

1

4181

1

//斐波那契数列
//--1 1 2 3 5 8 13 21 34 55.....

//输入n
//循环n次
//每次输入a
//计算第a个斐波那契数
//打印

cpp 复制代码
#include <iostream>

using namespace std;

int main()
{
	int n;
	int a;
	cin >> n;//3
	while(n--)//n次询问 
	{
		cin >> a;
		//计算第a个斐波那契数 
		int x = 1;
		int y = 1;
		int z = 1;
		
		while(a >= 3)
		{
			z = x+y;
			x = y;
			y = z;
			a--; 
		}
		//输出
		cout << z << endl; 
		
	 } 
	
	return 0;
}

求e的值

利用公式 e=1+1/1!+1/2!+1/3!+⋯+1/n!,求 e 的值,要求保留小数点后 10 位。

输入格式

输入只有一行,该行包含一个整数 n,表示计算 e 时累加到 1/n!。

输出格式

输出只有一行,该行包含计算出来的 e 的值,要求打印小数点后 10 位。
//乘法,有可能超过int类型
//--long long
//输入n
//sunm = 1
//循环n次
// 算出阶乘
// 1.0/阶乘
// 求和

cpp 复制代码
#include <iostream>
#include <cstdio>

using namespace std;

int main()
{
	int n;
	double sum = 1;//要累计除 
	cin >> n;
	
	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("%.10f\n",sum);
	
	
	return 0;
 } 

代码还可以优化

cpp 复制代码
//代码还可以优化

int main()
{
	int n;
	double sum = 1;//要累计除 
	cin >> n;
	
	long long r = 1;
	//循环n	
	for(int i = 1;i <= n;i++)
	{
		//求i的阶乘
	    r *= i;
		sum += 1.0 / r;
	}
	printf("%.10f\n",sum);
	
	
	return 0;
 } 

三角形

输入n,输出用*构成的n个三角形

cpp 复制代码
//三角形
//输入n,输出用*构成的n个三角形

#include <iostream>
#include <cstdio>

using namespace std;

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

画矩形

根据输入的四个参数:a,b,c,f 参数,画出对应的矩形。

前两个参数 a,b 为整数,依次代表矩形的高和宽;

第三个参数 c 是一个字符,表示用来填充的矩形符号;

第四个参数 f 为整数,0 代表空心,否则代表实心。

输入格式

第一行:a,b,c,f。

输出格式

一个矩形。

数据范围:

3≤a≤100。

5≤b≤100。

保证 c 是一个可见的字符(ASCII 码在 [33,126] 内)。

0≤f≤1。

cpp 复制代码
//画矩形 

//循环7(a)次 ,每次打印 一行 

#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++)
		{
			
			for(int j = 1; j <= b;j++)
			{
			    if(i ==1 || i == a || j ==1 || j == b)
			        cout << c;
			    else
			        cout << " ";
			} 
			cout << endl;
		}
		
	}
	//直接打印a行b列的实心矩形
	else
	{
		
		for(int i = 1;i <= a;i++)
		{
			//打印1行
			for(int j = 1;j <= b;j++)
			{
				cout << c;
				
			 } 
			 cout << endl;
		 } 
    }
	
	
	
	return 0;
}

有点冗余,可优化

cpp 复制代码
#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++)
	{
		
		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小的质数

输入一个正整数 n,求正整数范围中第 n 小的质数。

输入格式

一个不超过 30000 的正整数 n。

输出格式

// 第n小的质数
//输入n
//从2开始向后,找到n个质数,d第n个质数就是第n个小的质数
//使用while

cpp 复制代码
#include <iostream>

using namespace std;

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

//但还是 不太对,洛谷B2085中有4个超时了
//优化思路,如果n有一个因子a,那么必然存在另一个因子b,
//使得n = a * b
//如果a 和 b 都大于 根号n,那么,a*b将大于n,
//这与 你= a * b矛盾
//因此至少有一个因子小于根号n

cpp 复制代码
#include <iostream>
#include <cmath>

using namespace std;


int main()
{
	int n;
	cin >> n;
	int i = 2;
	int cnt = 0;
	while(1)
	{
		//100
		//判断i是否是素数 
		int flag = 1;//假设i是素数 
		for(int j = 2;j <=aqrt(1);j++)//sqrt是开方函数 
		{
			if(i % j == 0)
			{
			    flag = 0;
			    break;
			}
		 } 
		 if(flag == 1)
		     cnt ++;
		 if(cnt == n)
		     break;
		 i++;
		 
	}
	cout << i << endl;
	
	return 0;
}

主要是sqrt函数的使用

找水仙花数/三位的自幂数

求100~999中的水仙花数,若三位数ABC,ABC + A^3 = B^3 + C^3,则称ABC为水仙花数

列如,153,输出每个数各占一行

//找水仙花数
//产生100~999的数
//判断是否为水仙花数

cpp 复制代码
#include <iostream>
#include <cmath>
#include <cstdio> 

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;
 } 
相关推荐
little_xianzhong3 小时前
Spring Boot + MyBatis 实现站位标记系统实战
java·开发语言
泊风9363 小时前
深入C语言底层系列28-埃拉托斯特尼筛法
c语言·开发语言·算法
JH30733 小时前
深入解析Tomcat类加载器:为何及如何打破Java双亲委派模型
java·开发语言·tomcat
爱吃煎蛋的小新3 小时前
C#语法回忆零散巩固(持续更新最新版)
java·开发语言·笔记·学习·算法·c#
一只乔哇噻3 小时前
java后端工程师进修ing(研一版‖day48)
java·开发语言·学习
数据知道3 小时前
Go基础:Go语言中内存分配用 new 还是 make?什么情况下该用谁?
服务器·开发语言·算法·golang·go语言
Absinthe_苦艾酒3 小时前
golang基础语法(三)常量、指针、别名、关键字、运算符、字符串类型转换
开发语言·后端·go
MSTcheng.3 小时前
【C++】类和对象—(下) 收官之战
开发语言·c++
迪丽热爱3 小时前
C程序设计-01程序设计和C语言
c语言·开发语言