当前位置:   article > 正文

【2023蓝桥杯】刷题笔记(C语言)_蓝桥杯c语言

蓝桥杯c语言

1、字符串包含最多的字符及其个数

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int i;
  5. char arr[1000] = { 0 };//定义字符串数组arr,初始化为0
  6. gets(arr);//从键盘输入字符串给arr
  7. // printf("%s\n",arr);//输出字符串数组
  8. // for(i=0;i<5;i++){
  9. // printf("%c\n",arr[i]);//逐个输出字符串
  10. // }
  11. int take[26] = { 0 }, A = 0;//定义数组take
  12.     //知道次数用for,不知道次数用while
  13. while (arr[A] != '\0') //gets()输入时用'\0',getchar()用'\n'
  14. {
  15. take[arr[A] - 'a']++;//判断每个字符出现的次数,take[0]表示a出现的次数...
  16. A++;//往后循环
  17. }
  18. int max = 0, word = 0; //初始化
  19. for (A = 1; A <= 26; A++)
  20. {
  21.         printf("%d",take[n-1]);//输出数组,直观的看到每个字符出现的次数
  22. if (take[A] > take[max]) //找出次数最大的数。A从1开始,因为max初试为0
  23. {
  24. max = A;
  25. }
  26. }
  27. printf("%c\n%d", 'a' + max, take[max]);
  28. return 0;
  29. }

2、输出数组的三种方法

  1. 下标法
  2. #include <stdio.h>
  3. void main()
  4. {
  5. int i;
  6. int a[10]={1,2,3,4,5,6,7,8,9,10};
  7. for(i = 0 ;i < 10; i++)
  8. {
  9. printf("%d ",a[i]);
  10. }
  11. printf("\n");
  12. }
  13. 通过数组名计算数组元素地址,找出元素的值
  14. #include <stdio.h>
  15. void main()
  16. {
  17. int i;
  18. int a[10]={1,2,3,4,5,6,7,8,9,10};
  19. int *p;
  20. p = a;
  21. for( i = 0 ; i < 10 ; i++ )
  22. {
  23. printf("%d ",*(p+i) );
  24. }
  25. printf("\n");
  26. }
  27. 用指针变量指向数组元素。
  28. #include <stdio.h>
  29. void main()
  30. {
  31. int i;
  32. int a[10]={1,2,3,4,5,6,7,8,9,10};
  33. int *p;
  34. for( p = a; p < (a+10) ;p++ )
  35. {
  36. printf("%d ",*p);
  37. }
  38. printf("\n");
  39. }
  40. 计算数组元素个数sizeof()
  41. #include <stdio.h>
  42. int main()
  43. {
  44. int arr[10] = { 0 };
  45. int sz = sizeof(arr) / sizeof(arr[0]);
  46. printf("%d\n", sz);
  47. return 0;
  48. }

3、计算成绩的及格率和优秀率

  1. #include <stdio.h>
  2. int main() {
  3. int n,pass_num=0,excell_num=0;//初始化及格人数和优秀人数
  4. float pass_rate,excell_rate;//浮点型 及格率和优秀率
  5. int score; //学生分数
  6. scanf("%d",&n); //学生人数
  7. for(int i=0;i<n;i++){
  8. scanf("%d",&score);
  9. if(score>=85){
  10. excell_num++;
  11. pass_num++;
  12. }else if(score>=60){
  13. pass_num++;
  14. }
  15. }
  16. pass_rate=(pass_num*100.0)/n;
  17. excell_rate=(excell_num*100.0)/n;
  18. printf("%.0f%%\n%.0f%%",pass_rate,excell_rate);
  19. //输出浮点数的整数部分,不输出小数点和小数点以下部分。小数部分 4 舍 5 入。
  20. return 0;
  21. }

4、请问要制作所有的 1到2020 号门牌,总共需要多少个字符 2?

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(int argc, char *argv[])
  4. {
  5. int count=0;
  6. for(int i=1;i<=2020;i++)
  7. {
  8. for(int j=i;j>0;j=j/10)
  9. {
  10. if(j%10==2)
  11. {
  12. count++;
  13. }
  14. }
  15. }
  16. printf("%d",count);
  17. // 请在此输入您的代码
  18. return 0;
  19. }
  1. #include <stdio.h>
  2. int main(){
  3. int count = 0;
  4. for (int i = 0; i < 2021;i++){
  5. int num = i;
  6. while(num){
  7. if(num % 10 == 2){
  8. count++;}
  9. num /= 10;
  10. }
  11. }
  12. printf("%d", count);
  13. return 0;
  14. }

5、0 到 9 的卡片各 2021 张,共 20210 张,请问可以从 1 拼到多少?

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. int i,t,sum=0;
  5. for(i=1;;i++)
  6. {
  7. for(t=i;t!=0;t/=10)
  8. if(t%10==1)
  9. sum++;
  10. if(sum>=2021)
  11. goto end;
  12. }
  13. end:printf("%d",i);
  14. return 0;
  15. }
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(int argc, char *argv[])
  4. { int sum=2021;
  5. int j;
  6. for( j=1;j>0;j++){
  7. for(int i=j;i>0;i/=10){
  8. if((i%10)==1){
  9. sum--;
  10. }
  11. }
  12. while(sum==0)
  13. goto end;
  14. }
  15. end:printf("%d",j);
  16. return 0;
  17. }
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(int argc, char *argv[])
  4. {
  5. // 请在此输入您的代码
  6. int i;
  7. int sum=1;
  8. for(i=1;sum<2022;i++)
  9. {
  10. if(i%10==1){sum++;} //个位为1
  11. if(i/100%10==1){sum++;} //百位
  12. if(i/10%10==1){sum++;}//十位
  13. if(i/1000==1){sum++;} //千位
  14. }
  15. printf("%d",i-1);
  16. return 0;
  17. }

6、数字三角形路径最大和

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //注意:题目中向左下走的次数与向右下走的次数相差不能超过 1,它是最后走的次数之间的差,
  4. //并不是每走一步的差。
  5. int max(int a,int b)//求最大值
  6. {
  7. return a>b?a:b;
  8. }
  9. int main(int argc, char *argv[])
  10. {
  11. int n,sum=0;
  12. int a[105][105],f[105][105];//a数组用描述题目,f数组用来存储和值
  13. scanf("%d",&n);
  14. for(int i=1;i<=n;i++)
  15. for(int j=1;j<=i;j++)
  16. scanf("%d",&a[i][j]);//输入数据
  17. f[1][1]=a[1][1];//把开头第一个数直接给f数组
  18. for(int i=2;i<=n;i++)//从第二行遍历开始
  19. {
  20. for(int j=1;j<=i;j++)
  21. {
  22. if(j==1) f[i][j]=f[i-1][j]+a[i][j];//每行f数组开头的数就等于a数组本身加上上一行的第一个数
  23. else if(i==j) f[i][j]=f[i-1][j-1]+a[i][j];//末尾的数和上一行相同
  24. else f[i][j]=max(f[i-1][j],f[i-1][j-1])+a[i][j];//重点,如果不是本身,则等于数组f的左上和右上的最大值加上数组a本身
  25. }
  26. }
  27. //找规律发现如果n为奇数时,最后必然走到最后行最中间的数,如果为偶数,则取中间两个数的最大值,
  28. //因为向左下走的次数与向右下走的次数相差不能超过 1
  29. if(n%2==1) printf("%d",f[n][n/2+1]);//奇数情况下
  30. else printf("%d",max(f[n][n/2],f[n][n/2+1]));
  31. return 0;
  32. }

7、购物单总价钱

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(int argc, char *argv[])
  4. {
  5. // 请在此输入您的代码
  6. float a;
  7. int b;
  8. float sum=0;
  9. while(scanf("%f %d",&a,&b)!=EOF)
  10. {
  11. sum+=1.0*a*b/100;
  12. if(a==0&&b==0) break;
  13. }
  14. printf("%.2f",sum);
  15. // printf("5200");
  16. return 0;
  17. }
  • EOF在scanf连用时代表-1的意思,当用到while(scanf()!=EOF),代表的意思是一直输入,直到scanf返回的值是-1时才会停止输入,也可以在while里面加上一些约束条件,使输入在特定的条件下就会停止,也可以在输入完成后按下Ctrl+z,可以强行停止输入

  • scanf这个函数是有一个返回值的, while(scanf("%d",&n)!=EOF) 当你在一直输入时,scanf不会返回-1,而当你通过某种方式,例如上面提到的ctrl+z停止输入后,scanf应该会返回-1,此时等价于EOF,那么这个循环就跳出停止

%.0f,表示不输出小数位,但要对第一位小数进行四舍五入
%.1f,表示保留一位小数,对第二位小数进行四舍五入

8、256MB 的空间可以存储多少个 3232 位二进制整数?

1MB = 1024KB 1KB = 1024字节(byte) 1字节 = 8位(bits)

%d 输出的是 int,
%ld 输出的是 long,
%lld 输出的是 long long;

int -2147483648~2147483647
long int -2147483648~2147483647
long long int -9223372036854775808~9223372036854775807
  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. // 1 MB = 1024 KB
  5. // 1 KB = 1024 Byte
  6. // 1 Byte = 8 bit
  7. long long count = 0;
  8. count = (256 * 1024 * 1024) / 4;
  9. printf("%lld",count);
  10. return 0;
  11. }

9、成绩分析(最高分、最低分、平均分)

  1. #include<stdio.h>
  2. #include <stdlib.h>
  3. int main(int argc, char *argv[])
  4. {
  5. int n,scores[10000],max=0,min=100;
  6. float aver,num=0;
  7. scanf("%d",&n);
  8. for(int i=0;i<n;i++)
  9. {
  10. scanf("%d",&scores[i]);
  11. num+=scores[i];
  12. if(scores[i]>max)
  13. max = scores[i];
  14. if(scores[i]<min)
  15. min = scores[i];
  16. }
  17. aver=num/n;
  18. printf("%d\n",max);
  19. printf("%d\n",min);
  20. printf("%.2f",aver);
  21. }

10、逆向冒泡排序

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(int argc, char *argv[])
  4. {
  5. //冒泡排序 对有N个字母的字符串时 完全乱序时 需要交换N*(N-1)/2次数
  6. //即最少需要15个字母
  7. //要求字典序最小 显然要取a-o这15个字典序最小的字母
  8. /*
  9. 逆向思考 字符串经过100次交换后 得到正序字符串abcdefghijklmno
  10. 而完全乱序的字符串onmlkjihgfedcba变成正序字符串需要105次交换
  11. 则将完全乱序的字符串交换5次即为所求答案
  12. 而要求字典序最小 将j交换5次到字符串最前面 就得到了最小情况
  13. */
  14. printf("jonmlkihgfedcba");
  15. return 0;
  16. }
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(int argc, char *argv[])
  4. {
  5. int i,m,t,j;
  6. int n=0;
  7. while((n*n-n)/2<100){ //求最坏情况下的字符串长度 15
  8. n=n+1;
  9. }
  10. m=(n*n-n)/2-100;//比起完全逆序,字符串可以比完全逆序少m次比较 5
  11. int arr[n];
  12. for(i=0;i<n;i++){
  13. arr[i]=97+n-i-1;//arr[]为完全逆序字符串
  14. }
  15. for(i=5;i>0;i--){
  16. if(arr[i]<arr[i-1]){
  17. t=arr[i];
  18. arr[i]=arr[i-1];
  19. arr[i-1]=t;
  20. }
  21. }
  22. for(i=0;i<n;i++){
  23. printf("%c",arr[i]);
  24. }
  25. return 0;
  26. }

11、闰年平年

  1. #include<stdio.h>
  2. int main(){
  3. int year=2000,day[7]={6,7,1,2,3,4,5},month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31},i,j=0,sum=0;
  4. for(;year<=2020;year++){
  5. if(year%400==0||year%4==0&&year%100!=0)month[2]=29; //闰年,2月29天
  6.         //能被400整除,或者能被4整除且不能被100整除
  7. else month[2]=28; //平年2月28天
  8. for(int k=1;k<=12;k++){
  9. for(i=1;i<=month[k];i++){
  10. if(day[j%7]==1||i==1)sum++;//星期1且每月第一天
  11. sum++;
  12. j++;
  13. if(year==2020&&k==10&&i==1){
  14. printf("%d",sum);
  15. return 0;}
  16. }
  17. }
  18. }
  19. }

12、等差素数数列

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. _Bool sushu(int b)
  4. {
  5. for(int a=2;a<b/2;a++)
  6. {
  7. if(b%a==0)
  8. {
  9. return 0; //不是素数
  10. }
  11. }
  12. return 1;//是素数
  13. }
  14. int main(int argc, char *argv[])
  15. {
  16. // 请在此输入您的代码
  17. int biaozhi=0;
  18. for(int i=2;i<50000;i++) //枚举首项
  19. if(sushu(i)) //当首项是素数时 接着寻找下一项
  20. {
  21. for(int j=2;j<1000;j++) //枚举公差
  22. {
  23. for(int t=0;t<10;t++) //找10个
  24. {
  25. if(sushu(i+j*t)) //等差数列公式:a[i+1]=a[1]+(n-1)d
  26. {
  27. biaozhi++;
  28. }
  29. else{
  30. biaozhi=0;
  31. break;
  32. }
  33. if(biaozhi==10)
  34. {
  35. printf("%d",j);
  36. return 0;
  37. }
  38. }
  39. }
  40. }
  41. return 0;
  42. }

13、能被n整除的数组成三位数出现的组合次数

  1. //核心:通过判断三个数出现的组合次数。
  2. #include<stdio.h>
  3. typedef long long LL;
  4. int main()
  5. {
  6. LL n =4; // i=1 1 4; 1 2 2; 1 3 不满足。i=2 不满足,退出循环
  7. //LL n =6; // i=1 1 6; 1 2 3; 1 3 不满足
  8. //LL n =9; //i=1 1 9; 1 2 不满足;1 3 3;1 4 不满足
  9. //i每次都是从1开始,j每次都是从i开始,到根号n结束。因为当i=1时,j*j是满足条件的最后一种情况
  10. //当i和j都能被整除是,k的值就是 n/i/j。 首先只需要求出能被整除的数的依次顺序,下一步在求组合数。
  11. LL i,j,k;
  12. int res = 0;
  13. for(i = 1;i*i*i<=n;i++) //三个数相同i。i*i*i
  14. if(n% i == 0) //并且i能被整除
  15. for(j = i;i*j*j<=n;j++) //此时从该数开始,找出后面相同的两个数j。i*j*j
  16. if(n/i%j == 0) //并且j能被整除
  17. {
  18. k = n/i/j;
  19. if(i == j && i ==k) res++; //三个数相等,只有一个组合
  20. else if(i == j || i == k || j == k) res += 3;//两个相等,3种组合
  21. else res += 6;//三个不相同的数,有6中组合方式
  22. }
  23. printf("%d",res);//输出最后的总的组合数
  24. // printf("2430"); n=2021041820210418
  25. return 0;
  26. }

14、连成一片的七段码数码管表达多少种不同的字符

  1. 回溯算法。 visit数组代表是否点亮。0表示灯不亮,用1表示灯亮。
  2. 思路是一段的数量=该段自己亮+该段亮且连通分支的数量。
  3. 最后由于每种情况都被算了两遍,故而要除以2
  4. #include <stdio.h>
  5. int BackTrack(int graph[][7],int visit[],int n,int i){
  6. int count=1;
  7. for(int x=0;x<n;x++){
  8. if(visit[x]==0&&graph[i][x]!=0){
  9. visit[x]=1;
  10. count+=BackTrack(graph,visit,7,x);
  11. visit[x]=0;
  12. }
  13. }
  14. return count;
  15. }
  16. int main(){
  17. int graph[7][7]={
  18. {1,1,0,0,0,1,0},
  19. {1,1,1,0,0,0,1},
  20. {0,1,1,1,0,0,1},
  21. {0,0,1,1,1,0,0},
  22. {0,0,0,1,1,1,1},
  23. {1,0,0,0,1,1,1},
  24. {0,1,1,0,1,1,1}
  25. };
  26. int visit[7]={0};
  27. printf("%d",BackTrack(graph,visit,7,0)/2);
  28. return 0;
  29. }

15、分子和分母的最大公约数是 1的分数

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include<stdio.h>
  4. int s(int a,int b)
  5. {
  6. if(a%b==0) return b;
  7. else return s(b,a%b);
  8. }
  9. int main()
  10. {
  11. int sum=0;
  12. for(int i=1;i<=2020;i++){
  13. for(int j=1;j<=2020;j++){
  14. if(s(i,j)==1)
  15. sum++;
  16. }
  17. }
  18. printf("%d",sum);
  19. return 0;
  20. }

16、输入一行包含一个整数,表示时间

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(int argc, char *argv[])
  4. {
  5. // 请在此输入您的代码
  6. long long n;
  7. scanf("%lld",&n);
  8. n/=1000; //1s=1000ms
  9. int h=n/60/60%24; //除分秒%24小时上限
  10. int m=n/60%60; //除秒%60分钟上限
  11. int s=n%60; //同理
  12. printf("%02d:%02d:%02d",h,m,s); //%02d,不足两位补0
  13. //%2d,去掉0就默认不足两位补空格
  14. return 0;
  15. }

17、数列求值

给定数列 1, 1, 1, 3, 5, 9, 17,⋯,从第 4项开始,每项都是前 3 项的和。求第 20190324项的最后 44 位数字。

  1. #include <stdio.h>
  2. int main(void)
  3. {
  4. int a=1,b=1,c=1,d,i;
  5. for(i=4;i<=20190324;i++)
  6. {
  7. # a b c 每次往后传递循环
  8. # a=b
  9. # b=c
  10. # c=a+b+c
  11. d=(a+b+c)%10000;
  12. a=b;
  13. b=c;
  14. c=d;
  15. }
  16. printf("%04d",d); # 前面有0就可以用%04d解决
  17. return 0;
  18. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/222649
推荐阅读
相关标签
  

闽ICP备14008679号