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;
}