C++蓝桥杯基础篇(四)
- 创业
- 2025-08-28 11:18:02

片头
嗨~小伙伴们,大家好!今天我们来学习C++蓝桥杯基础篇(四),继续练习相关习题。准备好了吗?咱们开始咯~
题目1 连续整数相加
思路分析:
这道题,我们可以把从键盘中读取n写在while循环条件里面,while(cin >> n),题目中明确指出:如果读入的n为0或者负数,则继续读取数字直至读入n值为正整数为止。因此,只要 n<=0,我们就不停的读取n,不作任何处理。
while循环条件应为:while(cin >> n,n<=0); 只要 n>0,立马跳出循环,作后续判断。
代码如下:
//连续整数相加 //读入2个整数值a和n,计算从a开始的n个连续整数的和 //注意,如果读入的n为0或为负数,则继续读取数字直至读入n值为正整数为止 //输入共一行,包含整数a和若干个整数n //输出一个整数,表示从a开始的n个连续整数的和 int main() { int a; cin >> a; int n; while (cin >> n , n <= 0); //此处执行语句为空语句 int sum = a; for (int i = 1; i < n; i++) { sum += a + i; } cout << "从 "<<a<<" 开始的 "<< n << " 个连续整数的和为: " << sum << endl; return 0; }题目2 约数
代码如下:
//约数 //输入1个整数n,按照从小到大的顺序输出它的全部约数、 //输入一个整数n //输出全部约数,每个约数占1行 int main() { int n; cin >> n; for (int i = 1; i < n; i++) { if (n % i == 0) //如果 n % i == 0,说明n可以被i整除 cout << i << endl; } return 0; }题目3 PUM
思路分析:
题目要求说,构造一个n行m列的矩阵,我们可以使用循环嵌套:
①外层的for循环控制行数,里面的for循环控制列数。
②定义变量k,表示矩阵中的数字。
③规定将每行的最后一个数字变为PUM,则里面的for循环的取值范围 0~m-2,从第0列~第m-2列,数字k都可在矩阵中出现。
④第m-1列,打印"PUM",打印完毕后,k自动加1。每打印完一行,执行换行操作。
代码如下:
//PUM //输入2个整数n和m,构造一个n行m列的数字矩阵 //矩阵中的数字从第一行到最后一行 //按从左到右的顺序依次为 1,2,3,4,...,n*m //矩阵构造完成后,将每行的最后一个数字变为PUM //输出最终矩阵 int main3() { int n, m; cin >> n >> m; for (int i = 0, k = 1; i < n; i++) //打印n行,i的取值范围 0~n-1 { for (int j = 0; j < m-1; j++, k++) //打印m-1行,j的取值范围 0~m-2 { cout << k << " "; } cout << "PUM" << endl; //最后一列打印"PUM" k++; //打印完毕后,k自动加1 } return 0; }题目4 余数
代码如下:
//余数 //输入一个整数n //请按顺序输出1~10000之间(不包括1~10000)的所有除以n余2的数字 //输入1个整数n //输出所有满足条件的数字,从小到大每行输出1个 int main() { int n; cin >> n; for (int i = 2; i < 10000; i++) { if (i % n == 2) { cout << i << endl; } } return 0; }题目5 六个奇数
题目说,读取一个整数x,输出x之后的6个奇数。如果该x为偶数,那么输出6个奇数;如果该x为奇数,那么它也算作6个奇数之一,后面只用输出5个奇数。咱们可以先判断x是否为奇数,如果不是奇数,将x加1变成奇数即可。接着只需要用for循环输出6个奇数。
代码如下:
//6个奇数 //读取1个整数x,输出x之后的6个奇数 //如果x也是奇数,那么它也算作6个奇数之一 //输入1个整数x //输出满足条件的奇数,每个占一行 int main() { int x; cin >> x; cout << endl; if (x % 2 == 0) x = x + 1; //如果输入的x本身就是奇数,则不需要执行if条件里面的语句 int ret; for (int i = 0; i < 6; i++) { ret = x + 2 * i; cout << ret << endl; } return 0; }题目6 乘法表
代码如下:
//乘法表 //输入一个整数n,输出n的乘法表,如下: // 1 × n = n // 2 × n = 2n // 3 × n = 3n // 4 × n = 4n // 5 × n = 5n // ... // 10 × n = 10n //输入一个整数n //输出n的乘法表 int main() { int n; cin >> n; for (int i = 1; i <= 10; i++) { printf("%d × %d = %d\n", i, n, i * n); cout << endl; } return 0; }题目7 实验
分析思路:
①我们可以定义3个int型变量,C表示兔子的数量,R表示老鼠的数量,F表示青蛙的数量,初始化均为0。
②如果读取的字符T为'C',那么兔子的数量为 C += A;如果读取的字符T为'R',那么老鼠的数量为 R += A;如果读取的字符T为'F',那么兔子的数量为 F += A;
③动物总数为 C+R+F,求每种动物所占百分比,用 ,最后乘以100%,保留2位小数。
代码如下:
//实验 //医学部一共进行了n场动物实验。 //共有3种小动物可用来实验,分别是青蛙、老鼠和兔子。 //每次实验都会选取其中1种动物来参与实验,选取数量若干。 //请你统计一下医学部一共用了多少小动物 //每种分别用了多少,每种动物使用数量占总量的百分比是多少 //输入第一行包含整数n,表示实验次数 //接下来n行,每行包含一个整数a(表示一次实验使用的小动物的数量) //和一个字符T(表示一次实验使用的小动物的类型) //'c'表示兔子,'r'表示老鼠,'f'表示青蛙 //输出所用动物总数,每种动物的数量,以及每种动物所占百分比 //输出百分比时,保留2位小数 int main() { int n; cin >> n; //实验次数 int C = 0; //兔子 int R = 0; //老鼠 int F = 0; //青蛙 int a; //表示一次实验使用的小动物的数量 char t; //表示一次实验使用的小动物的类型 while (n--) { cin >> a >> t; if (t == 'c') C += a; else if (t == 'r') R += a; else F += a; } printf("所用动物总数: %d\n", C + R + F); printf("兔子的数量为: %d\n", C); printf("老鼠的数量为: %d\n", R); printf("青蛙的数量为: %d\n", F); printf("兔子所占的百分比为: %.2lf %%\n", (1.0 * C) / (C + R + F) * 100); printf("老鼠所占的百分比为: %.2lf %%\n", (1.0 * R) / (C + R + F) * 100); printf("青蛙所占的百分比为: %.2lf %%\n", (1.0 * F) / (C + R + F) * 100); return 0; }题目8 区间2
代码如下:
//区间2 //读取n个整数x1,x2,x3,...,xn, //判断这n个整数中有多少个在[10,20]的范围内,有多少个在范围外 //输入第一行包含整数n,表示共有n个整数需要进行判断 //接下来n行,每行包含一个整数xi //第一行输出"x in",其中x为在范围内的整数的数量 //第二行输出"y out",其中y为在范围外的整数的数量 int main() { int n; cin >> n; int k; int x = 0; int y = 0; while (n--) { cin >> k; if (k >= 10 && k <= 20) x++; //在范围内的整数的数量 else y++; //在范围外的整数的数量 } cout << x << " in" << endl; cout << y << " out" << endl; return 0; }题目9 连续奇数的和2
注意:如果输入的x>y,咱们需要调用swap函数进行交换,保证x<=y。
代码如下:
//连续奇数的和2 //输入n对整数对x,y //对于每对x,y,请你求出它们之间(不包括x和y)的所有奇数的和 //第一行输入整数n,表示共有n对测试数据 //接下来n行,每行输入一组整数x和y //每对x,y输出一个占一行的奇数和 int main() { int n; cin >> n; int x, y; int sum = 0; while (n--) { cin >> x >> y; if (x > y) swap(x, y); for (int i = x + 1; i < y; i++) { if (i % 2 == 1) { sum += i; } } cout << sum << endl; } return 0; }题目10 简单斐波那契
在之前的篇章中,我们讲过如何求斐波那契数列的第n项。这里,我们需要输出这个序列的前n项。
abf(1)=0f(2)=1f(2)=1f(3)=1f(3)=1f(4)=2f(4)=2f(5)=3f(5)=3f(6)=5f(6)=5f(7)=8f(7)=8f(8)=13f(8)=13f(9)=21f(9)=21f(10)=34......
f(n-2)f(n-1)f(n-1)f(n)f(n)f(n+1)
我们要输出数列的前n项,那么只需要将数列打印出来即可。观察表格,a列就是我们需要打印的。
代码如下:
//简单斐波那契 //以下数列 0 1 1 2 3 5 8 13 21 ...被称为斐波那契数列 //这个数列从第3项开始,每一项都等于前2项之和 //输入一个整数n,请你输出这个数列的前n项 //输入一个整数n //在一行中输出斐波那契数列的前n项,数字之间用空格隔开 // a b // 0 1 f(1) f(2) // 1 1 f(2) f(3) // 1 2 f(3) f(4) // 2 3 f(4) f(5) // 3 4 f(5) f(6) // 4 7 f(6) f(7) //.... // f(n-3) f(n-2) // f(n-2) f(n-1) // f(n-1) f(n) // f(n) f(n+1) int main() { int a = 0; //第1项 int b = 1; //第2项 int n; cin >> n; //第n项 for (int i = 1; i <= n; i++) { cout << a << " "; int c = a + b; a = b; b = c; } cout << endl; return 0; }题目11 数字序列和它的和
解题思路:
①这道题,我们可以把输入整数对m,n放在while循环条件里面,并且保证m>0 && n>0。当 m<=0或者n<=0时,不进入循环。while循环条件为:while(cin>>m>>n, m > 0 && n > 0)。
②如果m>n,调用swap函数交换值。使得m为最小值,n为最大值。用for循环输出从最小值到最大值的数字序列以及数字序列各数字之和。
代码如下:
//数字序列和它的和 //输入若干个整数对m,n //对于每个整数对 //输出以这2个数为最大值和最小值的公差为1的等差数列 //注意,当输入整数对中 //任意一个数为0或负整数时,立即停止输入,且该组数对无需作任何处理 //输入共若干行,每行包含2个整数 //最后一行的2个整数中,至少有一个是非正整数 //对于每组需作处理的数对,输出一个结果,每个结果占一行 //结果包含从最小值到最大值的数字序列以及数字序列各数字之和 int main() { int m, n; int sum = 0; while (cin >> m >> n , m > 0 && n > 0) { if (m > n) swap(n, m); for (int i = m; i <= n; i++) { cout << i << " "; sum += i; } cout << "Sum = " <<sum << endl; sum = 0;//每次计算完,sum必须归零 cout << endl; } return 0; }题目12 完全数
这道题,最简单的做法:先求这个数的所有约数,用1~x-1来循环判断是否能被x整除,用一个变量sum来存储所有约数的和,如何sum和这个数本身相同,那么这个数则是完全数;否则不是完全数。
代码如下:
//完全数 //一个整数,除了本身以外的其他所有约数的和如果等于该数 //那么我们就称这个整数为完全数 //例如,6就是一个完全数 //因为它除了本身以外的其他约数的和为 1+2+3 = 6 //现在,给定你n个整数,请你依次判断这些数是否为完全数 //输入第一行包含整数n,表示共有n个测试用例 //接下来n行,每行包含一个需要你进行判断的整数x //每个测试用例输出1个结果,每个结果占一行 //如果测试数据是完全数,则输出"X is perfect",其中x是测试数据 //如果测试数据不是完全数,则输出"X is not perfect",其中x是测试数据 //基础版 int main() { int n; cin >> n; //共有n个测试用例 cout << endl; int x; while (n--) { cin >> x; int sum = 0; //每次计算完,sum必须归零 for (int i = 1; i < x; i++) { if (x % i == 0) { //求x的所有约数 sum += i; } } if (sum == x) cout << x << " is perfect" << endl; else cout<< x << " is not perfect" << endl; } return 0; }但是如果每次输入的x都很大,那么循环判断1~x-1就会非常浪费时间,占用空间。有没有更好一点的方法呢?
有!打个比方:12的约数有1,2,6,3,4。约数都是成对出现的。
2是12的约数,那必然 12/2 = 6也是12的约数;3是12的约数,12/3 = 4也是12的约数。所以,我们在枚举约数的时候,枚举较小的约数即可。
d是x的约数,也是x的约数。满足 d <= 。 <= x,d <= 。
因此,我们只需要循环条件为 i*i<=x ,先求出较小的约数,再用 x/i 求出另外一个较大的约数即可。不必再用 i < x-1 了。
举个例子:x为36,i*i<=x,i 的可取值为1,2,3,4,6(较小的约数)。那么相对应的 x/i 为 36,18,12,9,6(较大的约数)。但是,约数不能自身,因此,我们需要去除36,对应的条件为 x/i < x;并且,2个约数不能相同,"6"只能出现1次,对应的条件为: i != x/i ;
代码如下:
//优化版 int main() { int n; cin >> n; //共有n个测试用例 cout << endl; int x; while (n--) { cin >> x; int sum = 0;//每次计算完,sum必须归零 for (int i = 1; i*i <= x; i++) { //只需要判断i*i是否小于等于x即可,先求出较小的约数 if (x % i == 0) { if (i < x) sum += i; //如果此时的i小于x,保存到sum里面 if (x / i != i && x / i < x) sum += x / i; //如果满足2个约数不同,并且较大的约数也小于自身x,那么保存到sum里面 } } if (sum == x) cout << x << " is perfect" << endl; else cout << x << " is not perfect" << endl; } return 0; }题目13 质数
质数:只能被1和自身整除的数。在之前的练习中已经做过,我们不再阐述。
代码如下:
//质数 //一个大于1的自然数,如果除了1和它自身外,不能被其他自然数整除 //7就是质数,因为它只能被1和7整除 //给定你n个大于1的自然数,判断这些数是否为质数 //输入第一行包含整数n,表示共有n个测试数据 //接下来的n行,每行包含1个自然数x //每个测试用例输出1个结果,每个结果占1行 //如果测试数据是质数,则输出"X is prime",x为测试数据 //如果测试数据不是质数,则输出"X is not prime",x为测试数据 int main() { int n; cin >> n; int x; while (n--) { cin >> x; bool flag = true; //假设为质数 for (int i = 2; i * i <= x; i++) { if (x % i == 0) { //如果x能被i整除,说明x不是质数 flag = false; //flag标记为false break; } } if (flag) cout << x << " is prime" << endl; else cout<< x << " is not prime" << endl; } return 0; }题目14 打印菱形
运用曼哈顿距离,|x1-cx|+|y1-cy|<=n/2,在上一篇中,我们已经详细阐述了,这里不再赘述。
代码如下:
//打印菱形 int main14() { int n; cin >> n; //中心点的坐标(n/2,n/2) int cx = n / 2; int cy = n / 2; //先打印n行n列的矩阵 for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (abs(i - cx) + abs(j - cy) <= n / 2) { //如果点和中心原点的距离<=n/2,打印"*" printf("*"); } else { //如果点和中心原点的距离>n/2,打印" " printf(" "); } } cout << endl; //打印完1行,换行 } return 0; }片尾
今天我们练习了循环相关的习题,希望对友友们有所帮助!!!
求点赞收藏加关注!!!
谢谢大家!!!
C++蓝桥杯基础篇(四)由讯客互联创业栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“C++蓝桥杯基础篇(四)”
上一篇
【运维】源码编译安装cmake