当前位置:   article > 正文

C语言之蓝桥杯习题 (小白2023年第一篇博客)_蓝桥杯题目c语言

蓝桥杯题目c语言

目录

一.第一题

1.问题:小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。计算最高分最低分和平均分(此分保留小数点后两位),(有的算及格率优秀率得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀)

 2.解题过程

3.结果​编辑

4.注意点+总结

二.第二题

1.问题:将九进制2022转化成十进制。(有关填空题我会进行复杂处理,比如明确给出输入数字,我会按照输入任意数据进行计算)

2.解题过程

3.结果​编辑

4.注意点+总结:有关进制转化问题

三.第三题

1.问题:大写字母A的ASCII是65,求解L的ASCII。

2.解题过程

3.结果

​编辑 4.注意点+总结:注意ASCII表的规律,以及通过转化成数字再转化成字母的方法。

四.第四题

1.问题:小蓝用256MB内存开辟数组,数组每个元素是32位二进制整数,不考虑程序占用的空间和维护内存需要的辅助空间,请问 256MB 的空间可以存储多少个 32 位二进制整数

​编辑 2.解题过程

3.结果

4.注意点+总结:关键点在于了解1 byte = 8 bit   ,1 KB = 1024 byte,1 MB = 1024 KB,,1 GB = 1024 MB,,1 PB = 1024 TB等单位转化关系,       第二点小心太大的数int会不会溢出。

五.第五题

1.问题:对于一个整数,能整除这个数的整数成为这个数的约数,1200000有多少个约数(只计算正约数)​编辑

2.解题过程

3.结果

4.注意点+总结:小心太大的数int会不会溢出。

六.第六题

1.问题:小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组 成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这 个字母出现的次数。如果有多个字母出现的次数相等,输出字典序最小的那个。​编辑

2.解题过程

3.结果

4.拓展:

七.第七题

1.问题:如果一个分数的分子和分母的最大公约数是1,这个分数称为既约分数。例如,4/3 , 5/2 ,1/8 ,7/1都是既约分数。请问,有多少个既约分数,分子和分母都是1到2020之间的整数(包括1 和2020)?

2.解题过程

3.结果

4.注意点+总结:(辗转相除法)


一.第一题

1.问题:小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。计算最高分最低分和平均分(此分保留小数点后两位),(有的算及格率优秀率得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀)

 2.解题过程

  1. #include<stdio.h>
  2. #include <math.h>
  3. int main()
  4. {
  5. int arr[100] = { 0 };
  6. int a = 0, n, max = 0,min=100;//min的赋值要小心,向大的放!!
  7. float mid = 0;//因为题目说平均分要以保留两位输出所以用float类型
  8. scanf("%d", &n);//输入总人数个数
  9. printf("\n");
  10. for (a = 0; a < n; a++)//利用循环进行输入每个人的成绩,并进行相关累加,判断操作
  11. {
  12. scanf("%d", &arr[a]);
  13. mid = mid + arr[a];//累加总分
  14. if (arr[a] > max)//判断最大数
  15. {
  16. max = arr[a];
  17. }
  18. else
  19. ;
  20. if (arr[a] < min)
  21. min = arr[a];
  22. }mid=round(mid / n*100)/100;//round用于进行四舍五入“但是round会保留到个位所以有*100的操作”
  23. printf("%d\n%d\n%0.2f\n",max,min,mid);//注意float类型不是默认转换两位小数,所以要进行0.2操作
  24. return 0;
  25. }

以下代码算及格率和优秀率:

  1. #include<stdio.h>
  2. #include <math.h>
  3. int main()
  4. {
  5. int arr[100] = { 0 };
  6. int a = 0, n,b=0,c=0;
  7. float mid = 0,m=0;
  8. scanf("%d", &n);
  9. printf("\n");
  10. for (a = 0; a < n; a++)
  11. {
  12. scanf("%d", &arr[a]);
  13. if (arr[a] >= 60)//计算及格
  14. {
  15. b++;
  16. mid = mid + arr[a];
  17. }
  18. else
  19. ;
  20. if (arr[a] >= 85)//计算优秀
  21. {
  22. c++;
  23. m = m + arr[a];
  24. }
  25. }mid = round(mid / b * 100) / 100;
  26. m = round(m / b * 100) / 100;
  27. printf("及格率%0.2f\n优秀率%0.2f\n", mid,m);
  28. return 0;
  29. }

3.结果

4.注意点+总结

(1).审题认真确定要使用的变量类型。

(2).善于利用循环进行同类型操作。(累加(减),找最大(小)数等)

(3).在找最大数是,要注意创建的变量max初始值一定要小,例如max=0;最小值则反之。

(4),使用round()库函数,要引用头文件#include <math.h>,并且该函数只会保留到个位,所以要提前先把要保留到的小数后几位变成个位以上,例如本题。

二.第二题

1.问题:将九进制2022转化成十进制。(有关填空题我会进行复杂处理,比如明确给出输入数字,我会按照输入任意数据进行计算)

2.解题过程

  1. int main()
  2. {
  3. int a = 0, b = 0,c,mid=1,d=0,e,f,h;
  4. char arr[10] = "0";
  5. gets(arr);//输入任意数字,获取字符串
  6. b=strlen(arr);//strlen用于求该字符串字符个数(不包括‘\0’)比sizeof方便
  7. f= strlen(arr);
  8. h= strlen(arr);
  9. for (a = 0; a<b-1; a++)
  10. {
  11. e = arr[a] - '0';//用于将字符串中的数字字符转化成数字
  12. mid = 1;
  13. for (c = h - 1; c > 0; c--)//计算该位置乘以9的个数
  14. {
  15. mid = mid * 9;
  16. }h--;
  17. e = e * mid;//计算该位数值大小
  18. d = d +e;//各个位置数字相加(不包括个位)
  19. }
  20. d = d + (arr[f - 1] - '0');//arr[f - 1] - '0'计算的是最后个位数值
  21. printf("%d", d);
  22. return 0;
  23. }

3.结果

4.注意点+总结:有关进制转化问题

每个进制的转化都是以十进制为桥梁,先转化十进制,再逆向转化成另一种进制

而转换方法就是让(该数据的每一位)*(乘以)该进制的(对应位置-1)次方,再相加【注意该数据的每一位最大值是该进制-1】

例如二进制01114->1*2^3+1*2^2+1*2^1+4*2^0;

三.第三题

1.问题:大写字母A的ASCII是65,求解L的ASCII。

2.解题过程

  1. int main()
  2. {
  3. int b = 0;
  4. char a='0';
  5. scanf("%c", &a);
  6. b = a - 'A' + 65;//这是通过转化成数字再转化成字母的方法。
  7. printf("%d",b);
  8. return 0;
  9. }

3.结果

 4.注意点+总结:注意ASCII表的规律,以及通过转化成数字再转化成字母的方法。

四.第四题

1.问题:小蓝用256MB内存开辟数组,数组每个元素是32位二进制整数,不考虑程序占用的空间和维护内存需要的辅助空间,请问 256MB 的空间可以存储多少个 32 位二进制整数

 2.解题过程

  1. int main()
  2. {
  3. long long a=0;//注意点,计算的结果有可能溢出,所以不用int
  4. scanf("%d",&a);
  5. a = (a * 1024 * 1024 * 8)/ 32;
  6. printf("%d",a);
  7. return 0;
  8. }

3.结果

4.注意点+总结:关键点在于了解1 byte = 8 bit   ,1 KB = 1024 byte,1 MB = 1024 KB,,1 GB = 1024 MB,,1 PB = 1024 TB等单位转化关系,       第二点小心太大的数int会不会溢出。

五.第五题

1.问题:对于一个整数,能整除这个数的整数成为这个数的约数,1200000有多少个约数(只计算正约数)

2.解题过程

  1. int main()
  2. {
  3. int a = 0, b, c = 0;
  4. for (b = 1; b < 1200000; b++)//注意点小心b的初始值。不可以是0
  5. {
  6. if (1200000 % b == 0)
  7. c++;
  8. }printf("%d",c);
  9. return 0;
  10. }

3.结果

4.注意点+总结:小心太大的数int会不会溢出。

六.第六题

1.问题:小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组 成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。
现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这 个字母出现的次数。如果有多个字母出现的次数相等,输出字典序最小的那个。

2.解题过程

  1. //法一:利用一个字符数组和整形数组计算;先将字符串中所有字符按字母顺序排列,再利用将字符串里面每个字符何其后面的相同字符个数加在一起,进而选出出现最多的字符并将其找到。(对于相同的字符排在最前面的算的次数多)
  2. void part(char* arr)//将字符串中所有字符按字母顺序排列。
  3. {
  4. char mid = "0";
  5. int a, b,c;
  6. c= strlen(arr);
  7. for (a = 0; a < c; a++)
  8. {
  9. mid = "0";
  10. for (b = a; b < c; b++)
  11. if (arr[a] > arr[b])
  12. {
  13. mid = arr[a];
  14. arr[a] = arr[b];
  15. arr[b] = mid;
  16. }
  17. }
  18. }
  19. int main()
  20. {
  21. char arr[100] = "0";
  22. int arr2[100] = { 0 };
  23. int a = 0, b = 0,c,d=0,max=0;
  24. gets(arr);
  25. b = strlen(arr);
  26. part(arr);
  27. for (c = 0; c < b; c++)//寻找字符数组中每个字符出现次数,数据放到其字符对应再int数组里出现的次数
  28. {
  29. d = 1;
  30. for (a = c+1; a < b; a++)
  31. {
  32. if (arr[c] == arr[a])
  33. {
  34. d++;
  35. }
  36. }arr2[c] = d;
  37. }
  38. for (a = 0; a < b; a++)//确定出现次数最多的字符的对应整形数组里面的位置
  39. {
  40. if (arr2[a] > max)
  41. max = arr2[a];
  42. }for (a = 0; a < b; a++)//找到对应字符
  43. {
  44. if (arr2[a] == max)
  45. {
  46. printf("%c \n%d\n", arr[a], max); break;
  47. }
  48. }
  49. return 0;
  50. }
  1. //方法2:和一类似但是相同的字符只会算在一起,并且将两个数组放到结构体里面运算
  2. struct zimu { char a; int b; };//创建结构体里面有两个变量
  3. struct zimu arr[26];//创建结构体数组
  4. int main()
  5. {
  6. int a = 0,c=0,d,e,max=0;
  7. for (a = 0; a < 26; a++)//char数组里面存放26个英文字母
  8. {
  9. arr[a].a = 'a' + a;
  10. arr[a].b = 0;
  11. }
  12. char arr1[100];
  13. gets(arr1);//输入字符串
  14. c = strlen(arr1);
  15. for (a = 0; a < c; a++)//让字符串中各个字符在结构体char里面找对应位置并且统计该字符个数
  16. {
  17. for (d = 0; d < c; d++)
  18. {
  19. if (arr1[a] == arr[d].a)
  20. {
  21. arr[d].b++;
  22. }
  23. }
  24. }
  25. for (a = 0; a < 26; a++)//找出出现字符的个数最多的字符所出现的个数
  26. {
  27. if (arr[a].b > max)
  28. max = arr[a].b;
  29. }
  30. for (a = 0; a < 26; a++)//找出对应字符位置
  31. {
  32. if (arr[a].b == max)
  33. printf("%c\n%d", arr[a].a, arr[a].b);
  34. break;
  35. }
  36. return 0;
  37. }

3.结果

4.拓展:

本题方法二用到了结构体数组直接使用,对于结构体数组的传参函数使用在http://t.csdn.cn/0sYsl里面有应用

七.第七题

1.问题:如果一个分数的分子和分母的最大公约数是1,这个分数称为既约分数。
例如,4/3 , 5/2 ,1/8 ,7/1都是既约分数。
请问,有多少个既约分数,分子和分母都是1到2020之间的整数(包括1 和2020)?

2.解题过程

  1. //法一
  2. int doit(int a, int b)//用于判断两个数的最大公因数是否是1,是返回1,否返回0
  3. {
  4. int max = (a > b ? a:b);
  5. for (max; max >= 1; max--)
  6. {
  7. if ((a % max == 0) && (b % max == 0))
  8. break;
  9. }
  10. if (max == 1)
  11. return 1;
  12. else
  13. return 0;
  14. }
  15. int main()
  16. {
  17. int a, b, c, d=0;
  18. for (a = 1; a <= 2020; a++)
  19. {
  20. for (b = 2020; b >=1; b--)
  21. {
  22. if (doit(a, b))//返回1为真,执行,0为假不执行
  23. d++;
  24. }
  25. }printf("%d",d);
  26. return 0;
  27. }
  1. int doit(int a, int b)
  2. {
  3. if (b == 0)
  4. return a;
  5. else
  6. return doit(b, a % b);//该方法运用了欧几里得算法,又名辗转相除法
  7. }
  8. int main()
  9. {
  10. int a, b, c, d = 0;
  11. for (a = 1; a <= 2020; a++)
  12. {
  13. for (b = 2020; b >= 1; b--)
  14. {
  15. if (doit(a, b) == 1)
  16. d++;
  17. }
  18. }printf("%d", d);
  19. return 0;
  20. }

3.结果

4.注意点+总结:(辗转相除法)

对于方法2,里面运用了欧几里得算法(又称辗转相除法)

欧几里得算法_百度百科 (baidu.com)     

使用关键在于,a  b  两个数的最大公约数同样也是他们两个数相减的差和a   b的最大公约数(至少一定是a  b  中较小数和差的最大公约数)

好啦这就是今天的内容啦谢谢大家阅读!!请点赞多多支持小白。

                                                   

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号