欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > C语言蓝桥杯组题目

C语言蓝桥杯组题目

2024/11/29 18:24:43 来源:https://blog.csdn.net/weixin_49853850/article/details/144016182  浏览:    关键词:C语言蓝桥杯组题目

系列文章目录

文章目录

  • 系列文章目录
  • 前言
  • 题目
    • 第一题.1, 2, 3, 4 能组成多少个互不相同且无重复数字的三位数?都是多少?
    • 第二题: 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
    • 第三题: 输入某年某月某日,判断这一天是这一年的第几天?
    • 第四题:输入三个整数X,Y,Z,请把这三个数由小到大输出
    • 第五题:C语言用*号输出字母C的图案 1
    • 第六题:C语言用*号输出图案 2
    • 第七题:C语言用*号输出图案 3
    • 第八题:C语言用*号输出图案=>输入菱形的高度,若为奇数,用*勾勒出棱形,否则输出报错
    • 第九题:C语言用*号输出图案=>时空沙漏
    • 第十题:C语言用九九乘法表
    • 第十一题:C语言输出国际象棋棋盘
    • 第十二题:打印楼梯,同时在楼梯上方打印两个笑脸。
    • 第十三题: 兔子生崽:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前30个月即可)
    • 第十四题:判断101到200之间的素数
    • 第十五题: 打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身例如:153是一个“水仙花数”,因为153 = 1的三次方+5的三次方+3的三次方
    • 第十六题:输入一个数,求他的质因数;
    • 第十七题:利用条件运算符的嵌套来完成此题:学习成绩> = 90分的同学用甲表示,60-89分之间的用乙表示,60分以下的用?表示
    • 第十八题:输入两个正整数,求其最大公约数和最小公倍数
    • 第十九题:输入一行字符,分别统计出其中英文字母,空格,数字和其它字符的个数
    • 第二十题:求S = A + AA + AAA + AAAA + AA …一个的值,其中一个是一个数字。例如2 + 22 + 222 + 2222 + 22222(此时共有5个数相加),几个数相加有键盘控制
    • 第二十一题:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6 = 1 + 2 + 3.编程找出1000以内的所有完数。
    • 第二十二题:猴子吃桃问题=》猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
    • 第二十三题: 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米第10次反弹多高?
    • 第二十四题: 两个乒乓球队进行比赛,各出三人。甲队为A,B,C三人,乙队为X,Y,Z三人。已抽签决定比赛名单。有人向队员打听比赛的名单.A说他不和X比,C说他不和X,Z比,请编程序找出三队赛手的名单
    • 第二十五题: 有一分数序列:2 / 1,3 / 2,5 / 3,8 / 5,13 / 8,21 / 13 …求出这个数列的前20项之和。
    • 第二十六题: 求1 + 2!+3!+ … + 20!的和。
  • 持续更新中..
  • 经典结尾


前言

蓝桥杯看着很简单实际有点难度,只有自己熟练掌握语法之后再去刷算法题才可以游刃有余.

题目

第一题.1, 2, 3, 4 能组成多少个互不相同且无重复数字的三位数?都是多少?

结果:
  •  可以组成 24 个三位数。
    
  •  三位数分别是: 123, 124, 132, 134, 142, 143, 213, 214, 231, 234, 241, 243, 312, 314, 321, 324, 341, 342, 412, 413, 421, 423, 431, 432.
    
#include <stdio.h>
main() {int i, j, k;for (i = 1; i <= 4; i++) {for (j = 1; j <= 4; j++) {for (k = 1; k <= 4; k++) {if (i != j && i != k && j != k) {printf("i=%d j=%d k=%d ", i, j, k);}}}}
}

思路

  • 使用穷举算法

第二题: 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

结果:
  •   该数是 21
    
#include <stdio.h>
#include <math.h>main() {int x;// 假设搜索范围为0到10000for (x = 0; x <= 10000; x++) {// 检查 x + 100 是否为完全平方数int a_square = x + 100;int b_square = x + 268;// 使用 sqrt 函数计算平方根并检查是否为完全平方数int a = (int)sqrt(a_square);int b = (int)sqrt(b_square);if (a * a == a_square && b * b == b_square) {printf("找到满足条件的整数: %d\n", x);return 0; // 找到解后退出}}printf("没有找到满足条件的整数。\n");
}

思路

  • 完全平方数检测:
  • 使用 sqrt() 函数计算平方根,并将结果转换为整数。
  • 检查 ( a ) 和 ( b ) 的平方是否分别等于 ( x + 100 ) 和 ( x + 268 )。

第三题: 输入某年某月某日,判断这一天是这一年的第几天?

结果:
  •   输入:
    
  •   	year:2000
    
  •   month:12
    
  •   	day:6
    
  •    结果: 341
    
#include <stdio.h>int main() {int year, month, day, sum = 0,i;int days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};printf("请输入年份:");scanf("%d", &year);printf("请输入月份:");scanf("%d", &month);printf("请输入日期:");scanf("%d", &day);// 判断是否为闰年if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {days[1] = 29;}// 计算天数for ( i = 0; i < month - 1; i++) {sum += days[i];}sum += day;printf("%d年%d月%d日是这一年的第%d天", year, month, day, sum);}

思路

  • 1.区分平年和闰年
  • 2.把每一年的天数加起来
  • 3.最后在输出

第四题:输入三个整数X,Y,Z,请把这三个数由小到大输出

结果:
  •   输入:
    
  •   	x: 200
    
  •       y: 12
    
  •   	z: 600
    
  •    结果: 12 200 600
    
#include <stdio.h>main() {int X, Y, Z;// 输入三个整数printf("请输入三个整数(X Y Z):");scanf("%d %d %d", &X, &Y, &Z);// 使用简单的排序算法进行排序int temp;// 冒泡排序if (X > Y) {temp = X;X = Y;Y = temp;}if (X > Z) {temp = X;X = Z;Z = temp;}if (Y > Z) {temp = Y;Y = Z;Z = temp;}// 输出结果printf("由小到大的顺序为:%d %d %d\n", X, Y, Z);
}

思路

  •    1.三个数用冒泡排序输出
    

第五题:C语言用*号输出字母C的图案 1

#include <stdio.h>main() {int height = 7; // 图案高度int width = 7;  // 图案宽度int i,j;for ( i = 0; i < height; i++) {for ( j = 0; j < width; j++) {// 输出 '*' 的条件if ((i == 0 && j > 0 && j < width - 1) ||  // 顶边(i == height - 1 && j > 0 && j < width - 1) ||  // 底边(j == 0 && (i > 0 && i < height - 1))) { // 左边printf("*");} else {printf(" ");}}printf("\n"); // 换行}
}
思路:1. 外层循环 for (int i = 0; i < height; i++) 控制行数(高度)。内层循环 for (int j = 0; j < width; j++) 控制列数(宽度)。2. 第一行和最后一行打印 * 的条件是:当 i 为 0 或 height - 1,且 j 在 0 和 width - 1 之间。左边竖线的条件是:j == 0 且 i 在 0 和 height - 1 之间。3. 在符合条件的情况下打印 *,否则打印空格

第六题:C语言用*号输出图案 2

图形:

  ****
*****

代码:

#include "Stdio.h" 
main(){int i,j,k;for(i=1;i<=3;i++) {for(k=3-i;k>0;k--)printf(" ");for(j=1;j<=i*2-1;j++){printf("*");}printf("\n");}		
}                       

思路:

1.外层循环控制行数
2.内层循环控制空格和*
3.答案直接出来

第七题:C语言用*号输出图案 3

图形:

  ****
*********

代码:

#include "Stdio.h" 
main(){int i,j,k;for(i=1;i<=3;i++) {for(k=3-i;k>0;k--)printf(" ");for(j=1;j<=i*2-1;j++){printf("*");}printf("\n");}for(i=2;i>0;i--) {for(k=3-i;k>0;k--)printf(" ");for(j=1;j<=i*2-1;j++){printf("*");}printf("\n");}		
}                                        

思路:

1.外层循环控制行数
2.内层循环控制空格和*
3.多写一个For循环
4.答案直接出来

第八题:C语言用号输出图案=>输入菱形的高度,若为奇数,用勾勒出棱形,否则输出报错

图形:

输入:5** **   ** **  

代码:

#include <stdio.h>
main()
{int n, i, j, m;printf("请输入一个高度:");scanf("%d",&n);m = (n + 1) / 2;//将图形分成两部分进行打印if (n % 2 != 0) {for (i = 1; i <= m; i++)//打印上半部分的图形,类似于打印正立的图形{for (j = m - i; j > 0; j--)printf(" ");for (j = 1; j <= 2 * i - 1; j++){//解决空心问题if (j == 1 || j == 2 * i - 1)printf("*");else printf(" ");}printf("\n");}//解决下半部分for (i = n - m; i > 0; i--){for (j = m - i; j > 0; j--)printf(" ");for (j = 1; j <= 2 * i - 1; j++){if (j == 1 || j == 2 * i - 1)printf("*");else printf(" ");}printf("\n");}}else printf("报错\n");
}

思路:

1.整体思考如何将图形拆开/2
2.外层循环控制行数
3 内层循环控制空格和*
4.多写一个For循环
5.答案直接出来

第九题:C语言用*号输出图案=>时空沙漏

图形:

  
************
*****

代码:

#include "Stdio.h" 
main(){int i,j,k;for(i=3;i>1;i--) {for(k=3-i;k>0;k--)printf(" ");for(j=1;j<=i*2-1;j++){printf("*");}printf("\n");}for(i=1;i<=3;i++) {for(k=3-i;k>0;k--)printf(" ");for(j=1;j<=i*2-1;j++){printf("*");}printf("\n");}		
}   

思路:

1.外层循环控制行数
2.内层循环控制空格和*
3.多写一个For循环
4.答案直接出来

第十题:C语言用九九乘法表

图形:

1*1=1
1*1=1 1*2=2
...

代码:

#include "Stdio.h" 
main(){int j,k;for(k=1;k<10;k++){for(j=1;j<=k;j++)printf("%d * %d = %d\t",j,k,k*j);printf("\n");}	
}   

思路:

1.外层循环控制行数
2.内层循环控制数字
3.答案直接出来

第十一题:C语言输出国际象棋棋盘

图形:

  白黑白黑白黑黑白黑白黑白

代码:

#include <stdio.h>
main() {int i,j;for ( i = 0; i < 8; i++) {for ( j = 0; j < 8; j++) {if ((i + j) % 2 == 0) {printf(" ");} else {printf("#");}}printf("\n");}
}

思路:

1.外层循环控制棋盘的宽
2.内层循环控制棋盘的高
3.加起来的和取模2等于0这输出一个#号
4.答案直接出来

第十二题:打印楼梯,同时在楼梯上方打印两个笑脸。

图形:

这个不好画出来,运行一下代码

代码:

#include <stdio.h>
main() {int i,j;printf("  ^_^  ^_^  \n"); for ( i = 1; i <= 5; i++) {for ( j = 1; j <= i; j++) {printf("*");}printf("\n");}
}

思路:

1.外层循环控制行数
2.内层循环控制楼梯的*号数量
3.答案直接出来

第十三题: 兔子生崽:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前30个月即可)

答案:

第 30 个月兔子总数有: 832040 只

#include "stdio.h" 
main(){long int a[30],i;a[0]=1;a[1]=1;for(i=2;i<30;i++){a[i] = a[i-1] + a[i-2];}for(i=0;i<30;i++)printf("第 %d 个月兔子总数有: %d 只 \n",i+1,a[i]);
}

思路:

1.定义数组
2.斐波拉契数列
3.答案出来了

第十四题:判断101到200之间的素数

素数:只能被1和它本身整除素数:101素数:103素数:107素数:109素数:113素数:127素数:131素数:137素数:139素数:149素数:151素数:157素数:163素数:167素数:173素数:179素数:181素数:191素数:193素数:197素数:199

代码:

#include "stdio.h" 
main(){int j,i,flag=1;for(i=100;i<=200;i++){flag=1;for(j=2;j<=(int)(i/2);j++){if(i%j == 0){flag = 0;break; }		}if(flag)printf("素数:%d\n",i);}
}

思路:

1.定义一个状态
2.[100 - 200]
3.答案出来了

第十五题: 打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数本身例如:153是一个“水仙花数”,因为153 = 1的三次方+5的三次方+3的三次方

答案:

水仙花:153
水仙花:370
水仙花:371
水仙花:407

代码:

#include "stdio.h" 
main(){int n1,i,n2,n3;for(i=100;i<=999;i++){n1 = i %10;n2 = i/10%10;n3 = i/100;if(n1*n1*n1+n2*n2*n2+n3*n3*n3 == i)printf("水仙花:%d\n",i);}}

思路:

1.把每一位数取出来
2.却他的立方
3.答案出来了

第十六题:输入一个数,求他的质因数;

答案:

  质因数:将一个数分解成若干个质数之积的过程比如  30 = 2*3*58 = 2*2*2520 = 2*2*2*5*13

代码:

方法1#include "stdio.h" main(){int n1,i;printf("请输入一个数:"); scanf("%d",&n1);for(i=2;i<=n1;i++) while(n1%i==0){printf("%d",i);n1/=i;if(n1!=1) printf("*");}}

方法2: 函数#include "stdio.h" 
int isWaterFairyFlower(int i){//判断(因子)i是否是素数int ret=1;int j ;for(j=2; j<i; j++){if(i%j == 0){ret = 0;break;}}return ret;
} int main(){int x;//记录输入的数int n=1;int i;scanf("%d",&x);printf("%d=",x);if(isWaterFairyFlower(x)){printf("%d",x);}else{while(x != 1){for(i=2 ; i<=x ; i++){if(isWaterFairyFlower(i) && x%i == 0){printf("%d",i);if(i != x ){printf("*");}x = x/i;i = 1; }}}}
}	
方法3#include "stdio.h" main(){int n1,i;printf("请输入一个数:"); scanf("%d",&n1);printf("%d=",n1);for(i=2;i<=n1;i++) while(n1!=i){if(n%i==0){printf("%d*",i);n1/=i;}else{break;}}}

思路:

1.知道什么是质因数(如果一个数的因数是质数,那么这个因数就是他的质因数)
2.什么是分解质因数(把一个合数用质数相乘的形式表示出来,叫作分解质因数。)
分解的过程:
> 首先,对正整数n进行分解因数,先找到一个最小的质数
> 其次,该正整数n为质数,则说明不需要分解
> 最后,如果该正整数n不是质数,但是能被最小的质数整除,就应该打印最小质数的值.

第十七题:利用条件运算符的嵌套来完成此题:学习成绩> = 90分的同学用甲表示,60-89分之间的用乙表示,60分以下的用?表示

答案:

输入:80
输出:
#include "stdio.h"
main(){
int score,i;printf("请输入一个成绩"); scanf("%d",&score);score>=90 ? printf("甲"): (score>=60 && score<90) ? printf("乙"):printf("?"); 
}

思路

1.读懂题意
2.知道条件运算符
3.答案出来了

第十八题:输入两个正整数,求其最大公约数和最小公倍数

思路:

1.最大公约数‌:两个或多个整数的公约数中最大的一个,记为(a,b)。例如,1218的公约数有1236,其中最大的是6,所以1218的最大公约数是6。
‌2.最小公倍数‌:两个或多个整数的公倍数中最小的一个,记为[a,b]。例如,1218的公倍数有244872等,其中最小的是24,所以1218的最小公倍数是36
#include "stdio.h"
main(){/*输入两个正整数米和N,求其最大公约数和最小公倍数*/int a,b,i,j,temp,max=0,min=0;printf("输入两个数: ");	scanf("%d,%d",&a,&b); temp=(a>b)?a:b; for(i=1;i<=temp;i++){if(a%i==0 && b%i==0){if(max < i)max = i; //最大公约数 }}//最小公倍数 for(j=temp;j<a*b;j++){if(j%a==0 && j%b==0){min = j;break; }}printf("最大公约数:%d 最小公倍数:%d",max,min); 
} 

第十九题:输入一行字符,分别统计出其中英文字母,空格,数字和其它字符的个数

答案:

输入:asb 123
输出:字符:3 空格 1 数字 123

代码1:

方法一
#include "stdio.h"
main(){/*输入一行字符,分别统计出其中英文字母,空格,数字和其它字符的个数。*/char ch[100];int i,english=0,number=0,other=0,nullSpace=0;printf("请输入一行字符:");scanf("%s",&ch);for(i=0;ch[i]!='\0';i++){if(ch[i]>='0' && ch[i] <='9')number++;else if(ch[i]>='a' && ch[i] <='z')english++;else if(ch[i]==' ')nullSpace++;else other++;}printf("英文字母:%d 空格:%d 数字:%d 其他字符:%d",english,nullSpace,number,other);	
} 
问题:这样就无法统计空格的数量,其他可以统计,请看方法2

代码2:

#include "stdio.h"
main(){/*输入一行字符,分别统计出其中英文字母,空格,数字和其它字符的个数。*/char ch[100];int i,english=0,number=0,other=0,nullSpace=0;printf("请输入一行字符:");gets(ch);for(i=0;ch[i]!='\0';i++){if(ch[i]>='0' && ch[i] <='9')number++;else if(ch[i]>='a' && ch[i] <='z')english++;else if(ch[i]==' ')nullSpace++;else other++;}printf("英文字母:%d 空格:%d 数字:%d 其他字符:%d",english,nullSpace,number,other);	
} 解决:把scanf换成gets就可

思路:

1.注意scanf 和 gets区别重要:gets可以接收空格;而scanf遇到空格、回车和Tab键都会认为输入结束,所有它不能接收空格
2.通关

第二十题:求S = A + AA + AAA + AAAA + AA …一个的值,其中一个是一个数字。例如2 + 22 + 222 + 2222 + 22222(此时共有5个数相加),几个数相加有键盘控制

结果:

输入:3
输出:369

代码:

#incldude "stdio.h"
main(){
int sum=0,i,num,num1=0,control;printf("请输入一个数:");scanf("%d",&num);printf("请输入需要几位数:"); scanf("%d",&control);if(num<10 && num>0){for(i=1;i<=control;i++){num1 = num1*10+num;sum +=num1;}printf("%d",sum);}elseprintf("error:请输入一个1-9的数字");
}

思路:

1.找规律
2.通关

第二十一题:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6 = 1 + 2 + 3.编程找出1000以内的所有完数。

答案:

1 是完数
6 是完数
28 是完数
496 是完数

代码:

#include <stdio.h>
main() {int sum,i,j; for ( i = 1; i <= 1000; i++) {sum = 1; // 因子之和,默认包含 1for ( j = 2; j <= i / 2; j++) {if (i % j == 0) {sum += j;}}if (sum == i) {printf("%d 是完数\n", i);}}
}

思路:

1.找规律
2.通关

第二十二题:猴子吃桃问题=》猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

答案:
1534

代码:

#include <stdio.h>
main() {int sum1=0,i=9,sum2=1;while(i>0){sum1 = (sum2+1)*2;sum2=sum1;i--;} printf("%d",sum1);
}

思路:

1.找规律
2.逆向思维:(x+1)*2 =>多吃一个的23.通关

第二十三题: 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米第10次反弹多高?

答案:

结果:10次落地,共经过299.80米第10次落地反弹0.10

代码:

/*一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米第10次反弹多高?
*/#include "Stdio.h" 
main(){int i;float height = 100,distance=100;for(i=1;i<=10;i++){distance /=2; height = height+distance*2;	} printf("第%d次落地,共经过%.2f米\n",i-1,height);printf("第%d次落地反弹%.2f米\n",i-1,distance);
}

思路:

1.100米高 和 反弹原来的一半
2.循环103.通关

第二十四题: 两个乒乓球队进行比赛,各出三人。甲队为A,B,C三人,乙队为X,Y,Z三人。已抽签决定比赛名单。有人向队员打听比赛的名单.A说他不和X比,C说他不和X,Z比,请编程序找出三队赛手的名单

结果:
三队赛手的名单:Z X Y

代码:

#include "Stdio.h" 
main(){char i;char j;char k;for(i='X';i<='Z';i++){for(j='X';j<='Z';j++){if(i!=j)for(k='X';k<='Z';k++){if(i!=k && j!=k){if(i!='X' && k!='X' && k!='Z')printf("三队赛手的名单:%c %c %c",i,j,k);}}		}}
}

思路:

1.考虑三个情况
2.根据题目条件判断表达式
3.通关

第二十五题: 有一分数序列:2 / 1,3 / 2,5 / 3,8 / 5,13 / 8,21 / 13 …求出这个数列的前20项之和。

答案:
前20项之和为:11.66

代码:

方法1:
#include "stdio.h"
main(){ double sum = 0.0;int f[20];f[0] = 1; // 第一个分子f[1] = 2; // 第二个分子for (int i = 2; i < 20; i++) {f[i] = f[i - 1] + f[i - 2]; // 生成斐波那契数列}for (int i = 0; i < 20; i++) {sum += (double)f[i] / f[i + 1]; // 计算每项的值}printf("前20项之和为:%.2f\n", sum);
}
方法2:
#include "stdio.h"
main(){ double a=2,b=1,temp;double sum=0;int i=1;for(i=1;i<21;i++){sum +=a/b;temp = a;a = a+b;b = temp;printf("%f + %f = %f\n",a,b,a/b); }printf("前20项之和为:%.2f\n", sum);}

思路:
1.思考问题
2.理清楚每一项再把他们加起来
3.通关

第二十六题: 求1 + 2!+3!+ … + 20!的和。

持续更新中…

经典结尾

烛光照亮了晚餐,照不出个答案;恋爱不是温馨的请客吃饭.

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com