C++蓝桥杯基础篇(四)

打印 上一主题 下一主题

主题 904|帖子 904|积分 2712

片头

嗨~小伙伴们,各人好!今天我们来学习C++蓝桥杯基础篇(四),继续练习相干习题。准备好了吗?咱们开始咯~


题目1  一连整数相加


   思路分析:
  这道题,我们可以把从键盘中读取n写在while循环条件内里,while(cin >> n),题目中明白指出:如果读入的n为0或者负数,则继续读取数字直至读入n值为正整数为止。因此,只要 n<=0,我们就不停的读取n,不作任那边置惩罚。
  while循环条件应为:while(cin >> n,n<=0); 只要 n>0,立马跳出循环,作后续判断。
  代码如下:
  1. //连续整数相加
  2. //读入2个整数值a和n,计算从a开始的n个连续整数的和
  3. //注意,如果读入的n为0或为负数,则继续读取数字直至读入n值为正整数为止
  4. //输入共一行,包含整数a和若干个整数n
  5. //输出一个整数,表示从a开始的n个连续整数的和
  6. int main() {
  7.         int a;
  8.         cin >> a;
  9.         int n;
  10.         while (cin >> n , n <= 0);   //此处执行语句为空语句
  11.         int sum = a;
  12.         for (int i = 1; i < n; i++) {
  13.                 sum += a + i;
  14.         }
  15.         cout << "从 "<<a<<" 开始的 "<< n << " 个连续整数的和为: " << sum << endl;
  16.         return 0;
  17. }
复制代码

题目2  约数


代码如下:
  1. //约数
  2. //输入1个整数n,按照从小到大的顺序输出它的全部约数、
  3. //输入一个整数n
  4. //输出全部约数,每个约数占1行
  5. int main() {
  6.         int n;
  7.         cin >> n;
  8.         for (int i = 1; i < n; i++) {
  9.                 if (n % i == 0)            //如果 n % i == 0,说明n可以被i整除
  10.                         cout << i << endl;
  11.         }
  12.         return 0;
  13. }
复制代码

题目3  PUM


   思路分析:
  题目要求说,构造一个n行m列的矩阵,我们可以使用循环嵌套:
  ①外层的for循环控制行数,内里的for循环控制列数。
  ②界说变量k,表示矩阵中的数字。
  ③规定将每行的最后一个数字变为PUM,则内里的for循环的取值范围 0~m-2,从第0列~第m-2列,数字k都可在矩阵中出现。
  ④第m-1列,打印"UM",打印完毕后,k自动加1。每打印完一行,执行换行操纵。
  代码如下:
  1. //PUM
  2. //输入2个整数n和m,构造一个n行m列的数字矩阵
  3. //矩阵中的数字从第一行到最后一行
  4. //按从左到右的顺序依次为 1,2,3,4,...,n*m
  5. //矩阵构造完成后,将每行的最后一个数字变为PUM
  6. //输出最终矩阵
  7. int main3() {
  8.         int n, m;
  9.         cin >> n >> m;
  10.         for (int i = 0, k = 1; i < n; i++)        //打印n行,i的取值范围 0~n-1
  11.         {
  12.                 for (int j = 0; j < m-1; j++, k++)    //打印m-1行,j的取值范围 0~m-2
  13.                 {
  14.                         cout << k << " ";
  15.                 }
  16.                 cout << "PUM" << endl;                //最后一列打印"PUM"
  17.                 k++;                                  //打印完毕后,k自动加1
  18.         }
  19.         return 0;
  20. }
复制代码

题目4  余数


代码如下:
  1. //余数
  2. //输入一个整数n
  3. //请按顺序输出1~10000之间(不包括1~10000)的所有除以n余2的数字
  4. //输入1个整数n
  5. //输出所有满足条件的数字,从小到大每行输出1个
  6. int main() {
  7.         int n;
  8.         cin >> n;
  9.         for (int i = 2; i < 10000; i++) {
  10.                 if (i % n == 2) {
  11.                         cout << i << endl;
  12.                 }
  13.         }
  14.         return 0;
  15. }
复制代码

题目5  六个奇数


题目说,读取一个整数x,输出x之后的6个奇数。如果该x为偶数,那么输出6个奇数;如果该x为奇数,那么它也算作6个奇数之一,后面只用输出5个奇数。咱们可以先判断x是否为奇数,如果不是奇数,将x加1变成奇数即可。接着只需要用for循环输出6个奇数。
代码如下:
  1. //6个奇数
  2. //读取1个整数x,输出x之后的6个奇数
  3. //如果x也是奇数,那么它也算作6个奇数之一
  4. //输入1个整数x
  5. //输出满足条件的奇数,每个占一行
  6. int main() {
  7.         int x;
  8.         cin >> x;
  9.         cout << endl;
  10.         if (x % 2 == 0) x = x + 1;  //如果输入的x本身就是奇数,则不需要执行if条件里面的语句
  11.         int ret;
  12.         for (int i = 0; i < 6; i++) {
  13.                 ret = x + 2 * i;
  14.                 cout << ret << endl;
  15.         }
  16.         return 0;
  17. }
复制代码

题目6  乘法表


 代码如下:
  1. //乘法表
  2. //输入一个整数n,输出n的乘法表,如下:
  3. // 1 × n = n
  4. // 2 × n = 2n
  5. // 3 × n = 3n
  6. // 4 × n = 4n
  7. // 5 × n = 5n
  8. // ...
  9. // 10 × n = 10n
  10. //输入一个整数n
  11. //输出n的乘法表
  12. int main() {
  13.         int n;
  14.         cin >> n;
  15.         for (int i = 1; i <= 10; i++) {
  16.                 printf("%d × %d = %d\n", i, n, i * n);
  17.                 cout << endl;
  18.         }
  19.         return 0;
  20. }
复制代码

题目7  实验


   分析思路:
  ①我们可以界说3个int型变量,C表示兔子的数量,R表示老鼠的数量,F表示田鸡的数量,初始化均为0。
  ②如果读取的字符T为'C',那么兔子的数量为 C += A;如果读取的字符T为'R',那么老鼠的数量为 R += A;如果读取的字符T为'F',那么兔子的数量为 F += A;
  ③动物总数为 C+R+F,求每种动物所占百分比,用 
,最后乘以100%,保留2位小数。
  代码如下: 
  1. //实验
  2. //医学部一共进行了n场动物实验。
  3. //共有3种小动物可用来实验,分别是青蛙、老鼠和兔子。
  4. //每次实验都会选取其中1种动物来参与实验,选取数量若干。
  5. //请你统计一下医学部一共用了多少小动物
  6. //每种分别用了多少,每种动物使用数量占总量的百分比是多少
  7. //输入第一行包含整数n,表示实验次数
  8. //接下来n行,每行包含一个整数a(表示一次实验使用的小动物的数量)
  9. //和一个字符T(表示一次实验使用的小动物的类型)
  10. //'c'表示兔子,'r'表示老鼠,'f'表示青蛙
  11. //输出所用动物总数,每种动物的数量,以及每种动物所占百分比
  12. //输出百分比时,保留2位小数
  13. int main() {
  14.         int n;
  15.         cin >> n;        //实验次数
  16.         int C = 0;        //兔子
  17.         int R = 0;        //老鼠
  18.         int F = 0;        //青蛙
  19.         int a;                //表示一次实验使用的小动物的数量
  20.         char t;                //表示一次实验使用的小动物的类型
  21.         while (n--) {
  22.                 cin >> a >> t;
  23.                 if (t == 'c') C += a;
  24.                 else if (t == 'r') R += a;
  25.                 else F += a;
  26.         }
  27.         printf("所用动物总数: %d\n", C + R + F);
  28.         printf("兔子的数量为: %d\n", C);
  29.         printf("老鼠的数量为: %d\n", R);
  30.         printf("青蛙的数量为: %d\n", F);
  31.         printf("兔子所占的百分比为: %.2lf %%\n", (1.0 * C) / (C + R + F) * 100);
  32.         printf("老鼠所占的百分比为: %.2lf %%\n", (1.0 * R) / (C + R + F) * 100);
  33.         printf("青蛙所占的百分比为: %.2lf %%\n", (1.0 * F) / (C + R + F) * 100);
  34.         return 0;
  35. }
复制代码

题目8  区间2


代码如下:
  1. //区间2
  2. //读取n个整数x1,x2,x3,...,xn,
  3. //判断这n个整数中有多少个在[10,20]的范围内,有多少个在范围外
  4. //输入第一行包含整数n,表示共有n个整数需要进行判断
  5. //接下来n行,每行包含一个整数xi
  6. //第一行输出"x in",其中x为在范围内的整数的数量
  7. //第二行输出"y out",其中y为在范围外的整数的数量
  8. int main() {
  9.         int n;
  10.         cin >> n;
  11.         int k;
  12.         int x = 0;
  13.         int y = 0;
  14.         while (n--) {
  15.                 cin >> k;
  16.                 if (k >= 10 && k <= 20) x++;  //在范围内的整数的数量
  17.                 else y++;                     //在范围外的整数的数量
  18.         }
  19.         cout << x << " in" << endl;
  20.         cout << y << " out" << endl;
  21.         return 0;
  22. }
复制代码

题目9  一连奇数的和2


注意:如果输入的x>y,咱们需要调用swap函数举行互换,保证x<=y。
代码如下:
  1. //连续奇数的和2
  2. //输入n对整数对x,y
  3. //对于每对x,y,请你求出它们之间(不包括x和y)的所有奇数的和
  4. //第一行输入整数n,表示共有n对测试数据
  5. //接下来n行,每行输入一组整数x和y
  6. //每对x,y输出一个占一行的奇数和
  7. int main() {
  8.         int n;
  9.         cin >> n;
  10.         int x, y;
  11.         int sum = 0;
  12.         while (n--) {
  13.                 cin >> x >> y;
  14.                 if (x > y) swap(x, y);
  15.                 for (int i = x + 1; i < y; i++) {
  16.                         if (i % 2 == 1) {
  17.                                 sum += i;
  18.                         }
  19.                 }
  20.                 cout << sum << endl;
  21.         }
  22.         return 0;
  23. }
复制代码

题目10  简单斐波那契


在之前的篇章中,我们讲过如何求斐波那契数列的第n项。这里,我们需要输出这个序列的前n项。
ab
f(1)=0f(2)=1
f(2)=1f(3)=1
f(3)=1f(4)=2
f(4)=2f(5)=3
f(5)=3f(6)=5
f(6)=5f(7)=8
f(7)=8f(8)=13
f(8)=13f(9)=21
f(9)=21f(10)=34
... ...
f(n-2)f(n-1)
f(n-1)f(n)
f(n)f(n+1)
 
我们要输出数列的前n项,那么只需要将数列打印出来即可。观察表格,a列就是我们需要打印的。

代码如下:
  1. //简单斐波那契
  2. //以下数列 0 1 1 2 3 5 8 13 21 ...被称为斐波那契数列
  3. //这个数列从第3项开始,每一项都等于前2项之和
  4. //输入一个整数n,请你输出这个数列的前n项
  5. //输入一个整数n
  6. //在一行中输出斐波那契数列的前n项,数字之间用空格隔开
  7. //  a      b
  8. //  0      1   f(1)   f(2)
  9. //  1      1   f(2)   f(3)
  10. //  1      2   f(3)   f(4)
  11. //  2      3   f(4)   f(5)
  12. //  3      4   f(5)   f(6)
  13. //  4      7   f(6)   f(7)
  14. //....
  15. // f(n-3) f(n-2)
  16. // f(n-2) f(n-1)
  17. // f(n-1) f(n)
  18. // f(n)   f(n+1)
  19. int main() {
  20.         int a = 0;                //第1项
  21.         int b = 1;                //第2项
  22.         int n;
  23.         cin >> n;                //第n项
  24.         for (int i = 1; i <= n; i++) {
  25.                 cout << a << " ";
  26.                 int c = a + b;
  27.                 a = b;
  28.                 b = c;
  29.         }
  30.     cout << endl;
  31.         return 0;
  32. }
复制代码

题目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循环输出从最小值到最大值的数字序列以及数字序列各数字之和。
  代码如下:
  1. //数字序列和它的和
  2. //输入若干个整数对m,n
  3. //对于每个整数对
  4. //输出以这2个数为最大值和最小值的公差为1的等差数列
  5. //注意,当输入整数对中
  6. //任意一个数为0或负整数时,立即停止输入,且该组数对无需作任何处理
  7. //输入共若干行,每行包含2个整数
  8. //最后一行的2个整数中,至少有一个是非正整数
  9. //对于每组需作处理的数对,输出一个结果,每个结果占一行
  10. //结果包含从最小值到最大值的数字序列以及数字序列各数字之和
  11. int main() {
  12.         int m, n;
  13.         int sum = 0;
  14.         while (cin >> m >> n , m > 0 && n > 0) {
  15.                 if (m > n) swap(n, m);
  16.                 for (int i = m; i <= n; i++) {
  17.                         cout << i << " ";
  18.                         sum += i;
  19.                 }
  20.                 cout << "Sum = " <<sum << endl;
  21.                 sum = 0;//每次计算完,sum必须归零
  22.                 cout << endl;
  23.         }
  24.         return 0;
  25. }
复制代码

 题目12  完全数


  这道题,最简单的做法:先求这个数的全部约数,用1~x-1来循环判断是否能被x整除,用一个变量sum来存储全部约数的和,如何sum和这个数本身相同,那么这个数则是完全数;否则不是完全数。
代码如下:
  1. //完全数
  2. //一个整数,除了本身以外的其他所有约数的和如果等于该数
  3. //那么我们就称这个整数为完全数
  4. //例如,6就是一个完全数
  5. //因为它除了本身以外的其他约数的和为 1+2+3 = 6
  6. //现在,给定你n个整数,请你依次判断这些数是否为完全数
  7. //输入第一行包含整数n,表示共有n个测试用例
  8. //接下来n行,每行包含一个需要你进行判断的整数x
  9. //每个测试用例输出1个结果,每个结果占一行
  10. //如果测试数据是完全数,则输出"X is perfect",其中x是测试数据
  11. //如果测试数据不是完全数,则输出"X is not perfect",其中x是测试数据
  12. //基础版
  13. int main() {
  14.         int n;
  15.         cin >> n;                                  //共有n个测试用例
  16.         cout << endl;
  17.         int x;
  18.         while (n--) {
  19.                 cin >> x;
  20.                 int sum = 0;                     //每次计算完,sum必须归零
  21.                 for (int i = 1; i < x; i++) {
  22.                         if (x % i == 0) {            //求x的所有约数
  23.                                 sum += i;
  24.                         }
  25.                 }
  26.                 if (sum == x) cout << x << " is perfect" << endl;
  27.                 else cout<< x << " is not perfect" << endl;
  28.         }
  29.         return 0;
  30. }
复制代码
但是如果每次输入的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 ;
代码如下:
  1. //优化版
  2. int main() {
  3.         int n;
  4.         cin >> n;        //共有n个测试用例
  5.         cout << endl;
  6.         int x;
  7.         while (n--) {
  8.                 cin >> x;
  9.                 int sum = 0;//每次计算完,sum必须归零
  10.                 for (int i = 1; i*i <= x; i++) {   //只需要判断i*i是否小于等于x即可,先求出较小的约数
  11.                         if (x % i == 0) {
  12.                                 if (i < x) sum += i;       //如果此时的i小于x,保存到sum里面
  13.                                 if (x / i != i && x / i < x) sum += x / i;
  14.                 //如果满足2个约数不同,并且较大的约数也小于自身x,那么保存到sum里面
  15.                         }
  16.                 }
  17.                 if (sum == x) cout << x << " is perfect" << endl;
  18.                 else cout << x << " is not perfect" << endl;
  19.         }
  20.         return 0;
  21. }
复制代码

题目13  质数


质数:只能被1和自身整除的数。在之前的练习中已经做过,我们不再阐述。
代码如下:
  1. //质数
  2. //一个大于1的自然数,如果除了1和它自身外,不能被其他自然数整除
  3. //7就是质数,因为它只能被1和7整除
  4. //给定你n个大于1的自然数,判断这些数是否为质数
  5. //输入第一行包含整数n,表示共有n个测试数据
  6. //接下来的n行,每行包含1个自然数x
  7. //每个测试用例输出1个结果,每个结果占1行
  8. //如果测试数据是质数,则输出"X is prime",x为测试数据
  9. //如果测试数据不是质数,则输出"X is not prime",x为测试数据
  10. int main() {
  11.         int n;
  12.         cin >> n;
  13.         int x;
  14.         while (n--) {
  15.                 cin >> x;
  16.                 bool flag = true; //假设为质数
  17.                 for (int i = 2; i * i <= x; i++) {
  18.                         if (x % i == 0) {    //如果x能被i整除,说明x不是质数
  19.                                 flag = false;    //flag标记为false
  20.                                 break;
  21.                         }
  22.                 }
  23.                 if (flag) cout << x << " is prime" << endl;
  24.                 else cout<< x << " is not prime" << endl;
  25.         }
  26.        
  27.         return 0;
  28. }
复制代码

题目14  打印菱形


 
运用曼哈顿距离,|x1-cx|+|y1-cy|<=n/2,在上一篇中,我们已经详细阐述了,这里不再赘述。
代码如下:
  1. //打印菱形
  2. int main14() {
  3.         int n;
  4.         cin >> n;
  5.         //中心点的坐标(n/2,n/2)
  6.         int cx = n / 2;
  7.         int cy = n / 2;
  8.    
  9.     //先打印n行n列的矩阵
  10.         for (int i = 0; i < n; i++) {
  11.                 for (int j = 0; j < n; j++) {
  12.                         if (abs(i - cx) + abs(j - cy) <= n / 2) {  //如果点和中心原点的距离<=n/2,打印"*"
  13.                                 printf("*");
  14.                         }
  15.                         else {                                     //如果点和中心原点的距离>n/2,打印" "
  16.                                 printf(" ");
  17.                         }
  18.                 }
  19.                 cout << endl;                                  //打印完1行,换行
  20.         }
  21.         return 0;
  22. }
复制代码

片尾

今天我们练习了循环相干的习题,渴望对友友们有所帮助!!!
点赞收藏加关注!!!
谢谢各人!!!



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

郭卫东

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表