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!的和。
    • 第二十七题: 利用递归方法求10!
    • 第二十八题:利用递归函数调用方式,将所输入的10个字符,以相反顺序打印出来
    • 第二十九题:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
    • 第三十题:一个5位数,判断它是不是回文数。即16561是回文数,个位与万位相同,十位与千位相同。
    • 第三十一题:有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
    • 第三十二题:选择排序
    • 第三十三题:求一个3×3矩阵对角线元素之和。输出:主对角线 副对角线 元素和
    • 第三十四题:已有一个已正序排好的9个元素的数组,今输入一个数要求按原来排序的规律将它插入数组中。
    • 第三十五题:已有一个10个元素的数组,要求按原来排序的规律将它排序(冒泡排序)
    • 第三十六题:矩阵转置
    • 第三十七题:字符串连接
    • 第三十八题:自定义函数反转字符串
    • 第三十九题:使用结构体实现年月日且是多少天
    • 第四十题:已有a、b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列
  • 第一期更新完毕,第二期直接进阶.
  • 个人感受
  • 经典结尾


前言

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

创作不易,你的鼓励,我的动力,学有所成,则是意义;

题目

第一题.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 
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 
#include 

main() {
    int x;
    // 假设搜索范围为0到10000
    for (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 

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 

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 

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 
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 
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 
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*5
  	     8 = 2*2*2
  	   520 = 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);
	}
	
	else
		printf("error:请输入一个1-9的数字");
}

思路:

1.找规律
2.通关

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

答案:

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

代码:

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

思路:

1.找规律
2.通关

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

答案:
1534

代码:

#include 
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!的和。

答案:

20项之和为:
	i=1   j=1
	i=2   j=2
	i=3   j=6
	i=4   j=24
	i=5   j=120
	i=6   j=720
	i=7   j=5040
	i=8   j=40320
	i=9   j=362880
	i=10   j=3628800
	i=11   j=39916800
	i=12   j=479001600
	i=13   j=1932053504
	i=14   j=1278945280
	i=15   j=2004310016
	i=16   j=2004189184
	i=17   j=-288522240
	i=18   j=-898433024
	i=19   j=109641728
	i=20   j=-2102132736

代码:

#include 
int jiecheng(int i){
	printf("i=%d  ",i);
	long int j=1;
	for(i;i>=1;i--){
		j *=i;
	}
	printf(" j=%d\n",j);
	return j;
} 
main(){
	long int i,sum=0;
	for(i=1;i<21;i++){
		sum +=jiecheng(i);
	}
	printf("%d",sum);
}

思路:
1.前20的每一个数的阶乘和
2.考虑值是否超出范围
3.通关

第二十七题: 利用递归方法求10!

答案:

请输入一个数: 6
			720

代码:

#include 
long int recursion(int num){
	if(num==0){
		return 1;
	}else{
		return  num * recursion(num-1);
	}
}
main(){
	long int result;
	int num;
	printf("请输入一个数:");
	scanf("%d",&num);
	result = recursion(num);
	printf("%d",result);
 }

思路:
1.递归:直接调用自己
2.为假时候返回值
3.通关

第二十八题:利用递归函数调用方式,将所输入的10个字符,以相反顺序打印出来

答案:

请输入10个字符:asdfghjklo
			  olkjhgfdsa

代码:

#include "stdio.h
void recursionPrintf(char a[],int i){
	if(i==-1){
		return ;
	}
	printf("%c",a[i]);
	recursionPrintf(a,i-1);
}
main(){
	char a[11]; //多一个是\0
	printf("请输入10个字符:");
	scanf("%s",&a);
	recursionPrintf(a,10);
}

思路:
1.递归:直接调用自己
2.把最大下标传过去依次减一
3.通关

第二十九题:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?

答案:
18

代码:

#include "Stdio.h
main(){
	int i,a=10;
	for(i=1;i<=4;i++){ //前几个人依次+2 
		a+=2;
	}
	printf("%d",a);
}

思路:
1.找规律和初始值
2.通关

第三十题:一个5位数,判断它是不是回文数。即16561是回文数,个位与万位相同,十位与千位相同。

答案:
请输入一个5位数:16561
16561 是回文数

代码:

#include "stdio.h"
void reversedNum(){
  int num, temp, reversedNum = 0;
  printf("请输入一个5位数:");
  scanf("%d", &num);
  if(num>10000){	
	  temp = num; // 备份原数
	  while (temp > 0) {
	    reversedNum = reversedNum * 10 + temp % 10; // 反转数字
	    temp /= 10;
	  }
	  if (num == reversedNum) {
	    printf("%d 是回文数\n", num);
	  } else {
	    printf("%d 不是回文数\n", num);
	  }	
  }
  else{
  	printf("输入错误!"); 
  }	
}

main(){
	reversedNum();
}

思路:
1.求解每一位数
2.组合成新的数字
3.新的数字与输入的数字相等即可
4.通关

第三十一题:有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?

答案:

请输入年份 n:66 年共有 9 头母牛。

代码:

#include 
main() {
 int i,n;
    printf("请输入年份 n: ");
    scanf("%d", &n);
    if (n <= 0) {
        printf("年份必须大于0。\n");
        return 1;
    }
    long int cows[n + 1];
    // 初始化母牛数量
    cows[1] = 1; // 第1年
    cows[2] = 1; // 第2年
    cows[3] = 1; // 第3年
    for ( i = 4; i <= n; i++) {
        cows[i] = cows[i - 1] + cows[i - 2] + cows[i - 3]; // 递推公式
    }
    printf("第 %d 年共有 %ld 头母牛。\n", n, cows[n]);
 }

思路:

1 年:1 头母牛(最初的母牛)。
第 2 年:1 头母牛(最初的母牛)。
第 3 年:1 头母牛(最初的母牛)。
第 4 年:2 头母牛(最初的母牛 +1 年出生的小牛)。
第 5 年:3 头母牛(最初的母牛 +1 年的小牛 +2 年出生的小牛)
总结:4年开始:母牛的数量为前一年母牛数量 + (前 3 年的母牛数量)

第三十二题:选择排序

答案
1 41 42 53 61 62 74 95 96 743

代码

方法1#include "stdio.h" 
main(){
	int a[10]={1,95,42,61,74,62,96,743,41,53};
	int i,j;
	for(i=0;i<10;i++){
		int mini=i;
		for(j=i+1;j<10;j++)
			if(a[j]<a[mini]){
				mini = j;
			}
		if(mini !=i){
			int temp;
			temp = a[i];
			a[i] = a[mini];
			a[mini]=temp;
		}
	}
	for(i=0;i<10;i++){
		printf("%d ",a[i]);
	}
}
方法2#include "stdio.h"
main(){
	int a[10]={1,95,42,61,74,62,96,743,41,53};
	int i,j,t,min;
	for(i=0;i<=9;i++)
		for(j=i+1;j<10;j++) 
			if(a[i]>=a[j]){
   				t=a[i];
               	a[i]=a[j];
                a[j]=t;
			}
	printf("排序后的顺序:");
	for(i=0;i<10;i++)	
		printf("%d ",a[i]);
}

思路:
1.找到最小值的下标
2.判断当前下标和最小值小标相等
3.通关

第三十三题:求一个3×3矩阵对角线元素之和。输出:主对角线 副对角线 元素和

答案:

输入:
1 2 7
1 2 1
3 2 3
输出:
6 12

代码:

方法1:简单粗爆
#include "stdio.h" 
main(){
int a[3][3];
	int i,j;
	for(i=0;i<3;i++){
		for(j=0;j<3;j++)	
		 scanf("%d",&a[i][j]);
		 printf("\n");
	}
 	printf("主对角线之和:%d 副对角线之和:%d",a[0][0]+a[1][1]+a[2][2],a[0][2]+a[1][1]+a[2][0]);
}
方法2:灵活多变
#include "stdio.h" 
main(){
	int a[3][3];
	int i,j;
 	int mainDiagonalSum = 0; // 主对角线和
      int secondaryDiagonalSum = 0; // 副对角线和
	for(i=0;i<3;i++){
		for(j=0;j<3;j++)	
		 scanf("%d",&a[i][j]);
		 printf("\n");
	}
	for(i=0;i<3;i++){
		mainDiagonalSum +=a[i][i];
		secondaryDiagonalSum +=a[i][2-i];
	}
	printf("主对角线之和:%d 副对角线之和:%d",mainDiagonalSum,secondaryDiagonalSum);
 
}

思路:
1.有行列概念
2.知道矩阵运算规则
3.通关

第三十四题:已有一个已正序排好的9个元素的数组,今输入一个数要求按原来排序的规律将它插入数组中。

答案:

原始已排序数组:
1 3 5 7 9 12 14 17 20
请输入要插入的数:96
插入后的数组:
1 3 5 7 9 12 14 17 20 96

代码:

#include "stdio.h"
#define SIZE 10 // 数组大小,包括要插入的元素
main() {
    int arr[SIZE] = {1, 3, 5, 7, 9, 12, 14, 17, 20}; // 已排序的9个元素
    int newNum,i,j;
    // 输出原始数组
    printf("原始已排序数组:\n");
    for (i = 0; i < 9; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    // 输入要插入的数
    printf("请输入要插入的数:");
    scanf("%d", &newNum);
    // 找到插入位置
    for (i = 8; i >= 0 && arr[i] > newNum; i--) {
        arr[i + 1] = arr[i]; // 移动元素以腾出插入位置
    }
    arr[i + 1] = newNum; // 插入新数
    // 输出插入后的数组
    printf("插入后的数组:\n");
    for ( j = 0; j < SIZE; j++) {
        printf("%d ", arr[j]);
    }
    printf("\n");

}

思路:

1.初始化数组:
	创建一个大小为 10 的数组,其中前 9 个元素已经按升序排列,最后一个元素将用于存放新插入的数字。
2.输入新数:
	提示用户输入要插入的新数。
3.查找插入位置:
	从数组的最后一个元素开始向前遍历,寻找合适的位置以保持数组的排序。将大于新数的元素依次向后移动。
4.插入新数:
	在找到的合适位置插入新数。
5.输出结果:
	打印插入后的数组。
6.通关

第三十五题:已有一个10个元素的数组,要求按原来排序的规律将它排序(冒泡排序)

答案:

原始数组:
13 14 52 12 22 11 90
排序后数组:
11 12 13 14 22 52 90

代码:
方法1

#include "stdio.h
main(){
	int arr[] = {13, 14, 52, 12, 22, 11, 90}; // 原始数组
    int n = sizeof(arr) / sizeof(arr[0]); // 数组大小
    int temp,i,j;
    printf("排序前:");
    for ( i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
    for (i = 0; i < n - 1; i++) {
        for (j = 0; j < n - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                // 交换
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
    printf("排序后:");
    for ( i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
}
方法2
#include 
void bubbleSort(int arr[], int n) {
    int temp,i,j;
    for (i = 0; i < n - 1; i++) {
        // 设置一个标志位,用于优化
        int swapped = 0;
        for (j = 0; j < n - 1 - i; j++) {
            if (arr[j] > arr[j + 1]) {
                // 交换
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;

                // 标记有元素交换
                swapped = 1;
            }
        }
        // 如果没有发生交换,数组已经排好序
        if (swapped == 0) {
            break;
        }
    }
}

void printArray(int arr[], int n) {
	int i;
    for ( i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int arr[] = {13, 14, 52, 12, 22, 11, 90}; // 原始数组
    int n = sizeof(arr) / sizeof(arr[0]); // 数组大小

    printf("原始数组:\n");
    printArray(arr, n); // 打印排序前的数组

    bubbleSort(arr, n); // 调用冒泡排序函数

    printf("排序后数组:\n");
    printArray(arr, n); // 打印排序后的数组

}

思路:

1.接收一个整数数组和数组的大小作为参数。
2.外层循环控制排序的轮数,内层循环进行相邻元素的比较与交换。
3.使用一个 swapped 标志位来检测是否进行了元素交换,以便在数组已经有序时提前结束排序过程。
4.通关

第三十六题:矩阵转置

答案

打印原始矩阵:
1 2 3 4
5 6 7 8
9 10 11 12
打印转置矩阵:
1 5 9
2 6 10
3 7 11
4 8 12

代码

#include "stdio.h" 
#define ROWS 3
#define COLS 4

void transpose(int mat[ROWS][COLS], int transposed[COLS][ROWS]) {
		int i,j;
    for ( i = 0; i < ROWS; i++) {
        for ( j = 0; j < COLS; j++) {
            transposed[j][i] = mat[i][j]; // 行列互换 
        }
    }
}

int main() {
    int original[ROWS][COLS] = {{1, 2, 3, 4},
                                {5, 6, 7, 8},
                                {9, 10, 11, 12}};
    int transposed[COLS][ROWS];
    int i,j;	
    printf("打印原始矩阵:\n");
    for ( i = 0; i < ROWS; i++) {  //打印原始矩阵 
        for ( j = 0; j < COLS; j++) {
            printf("%d ", original[i][j]);
        }
        printf("\n");
    }
    transpose(original, transposed); //转置矩阵 
    printf("打印转置矩阵:\n");
    for ( i = 0; i < COLS; i++) {  //打印转置矩阵 
        for ( j = 0; j < ROWS; j++) {
            printf("%d ", transposed[i][j]);
        }
        printf("\n");
    }
}

思路:
1.高数矩阵知识
2.行列互换
3.通关

第三十七题:字符串连接

答案:

请输入第二个字符串:asdfghjkl
请输入第一个字符串:padsjd
打印连接字符串:asdfghjklpadsjd

代码

#include "stdio.h"
#include "string.h"
main(){
	char ch1[50],ch2[50];
	printf("请输入第二个字符串:");
	gets(ch1);
	printf("请输入第一个字符串:");
	gets(ch2);
	printf("打印连接字符串:");
	strcat(ch1,ch2);
	puts(ch1);
}

思路:

1.用了一个string库
2.使用以及写好的库函数
3.通关

第三十八题:自定义函数反转字符串

答案:

请输入一个字符串:asdfghjkl
原始字符串: asdfghjkl
反转后的字符串: lkjhgfdsa

代码:

#include 
#include 
// 自定义函数:反转字符串
void reverseString(char *str) {
    int temp, r, l;
    l=0;
    r=strlen(str)-1;
    while(l<r){
    	temp = str[l];
    	str[l] = str[r];
    	str[r] = temp;
    	l++;
    	r--;
    }
   
}
main() {
    char myString[] = "";
    printf("请输入一个字符串:");
    scanf("%s",&myString);
    printf("原始字符串: %s\n", myString);
    // 调用自定义函数反转字符串
    reverseString(myString);
    printf("反转后的字符串: %s\n", myString);
    
}

思路:
1. 使用string库函数文件的函数
2. 一维数组和指针的用法类似。
3. 字符串最终以‘\0’结尾,注意反序以后设置。
4. 数组是不可以在函数中return返回得到的,可以设置一个指针来接收数组。
5. 当函数执行完之后,数组被分配的空间会释放,因此,可以将数组的地址也传过去,这样函数执行完也不会释放空间了。
6. 接收一个字符指针(字符串)作为参数。 使用两个指针 l和 r 分别指向字符串的开头和结尾。 通过循环交换 l和 r指向的字符,直到两个指针相遇,从而实现字符串反转。

第三十九题:使用结构体实现年月日且是多少天

答案:

请输入年份:2024
请输入月份:12
请输入日期:1
2024121日是336

代码:

#include 
/*
定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。
*/
typedef int ElemType;

typedef struct {
	ElemType year;
	ElemType month;
	ElemType day;	
}Date; 

int dayOfYearNumber(Date date){
	ElemType arr[] ={31,28,31,30,31,30,31,30,30,31,30,31} ;
	ElemType dayOfYear=0;
	//判断是否闰年
  	if(date.year%4==0&&date.year%100!=0||date.year%400==0){
	  	arr[1] = 29;
 	}
 	//判断输入月份和日是否合法 
 	if(date.month<0 || date.month>12||date.day<0||date.day>31){
	 	printf("输入的日期有误\n");
	 } else{
 		//计算那一天
 		 int i;
		for(i=0;i<date.month-1;i++){
			dayOfYear +=*(arr + i); //通过指针的方式来获取值 
		} 
		dayOfYear +=date.day;
		
 	} 
 	return dayOfYear;
     
}



int main(int argc, char *argv[])
{
	Date     date;
	ElemType dayOfYear;
	printf("请输入年-月-日(格式:2000 12 6):");
	scanf("%d %d %d",&date.year,&date.month,&date.day);
	printf("输入的是:%d年%d月%d日",date.year,date.month,date.day);
	dayOfYear = dayOfYearNumber(date);
	printf("\n%d-%d-%d的%d月是这一年的%d天\n",date.year,date.month,date.day,date.month,dayOfYear); 
	return 0;
}

思路:
1.明白结构体
2.判断闰年
3.通关

第四十题:已有a、b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列

结果:

链表 A:
学号: 101, 成绩: 215.00
学号: 103, 成绩: 175.00
学号: 105, 成绩: 238.00
链表 B:
学号: 102, 成绩: 235.00
学号: 104, 成绩: 189.00
学号: 106, 成绩: 244.00

合并后的链表:
学号: 101, 成绩: 215.00
学号: 102, 成绩: 235.00
学号: 103, 成绩: 175.00
学号: 104, 成绩: 189.00
学号: 105, 成绩: 238.00
学号: 106, 成绩: 244.00

代码:

#include 
#include 

// 定义链表结点结构体
struct Node {
    int studentID; // 学号
    float score;   // 成绩
    struct Node* next; // 指向下一个结点的指针
};

// 创建新结点
struct Node* createNode(int studentID, float score) {
    struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
    newNode->studentID = studentID;
    newNode->score = score;
    newNode->next = NULL;
    return newNode;
}

// 合并两个链表
struct Node* mergeLists(struct Node* list1, struct Node* list2) {
    struct Node dummy; // 哨兵节点
    struct Node* tail = &dummy; // 尾指针初始化为哨兵节点
    dummy.next = NULL; // 初始化哨兵节点的下一节点为空

    while (list1 != NULL && list2 != NULL) {
        if (list1->studentID < list2->studentID) {
            tail->next = list1; // 将较小的节点链接到结果链表
            list1 = list1->next;
        } else {
            tail->next = list2;
            list2 = list2->next;
        }
        tail = tail->next; // 移动尾指针
    }

    // 连接剩余的节点
    if (list1 != NULL) {
        tail->next = list1;
    } else {
        tail->next = list2;
    }

    return dummy.next; // 返回合并后的链表头
}

// 打印链表
void printList(struct Node* head) {
    struct Node* current = head;
    while (current != NULL) {
        printf("学号: %d, 成绩: %.2f\n", current->studentID, current->score);
        current = current->next;
    }
}

int main() {
    // 创建链表 a
    struct Node* a = createNode(101, 215);
    a->next = createNode(103, 175);
    a->next->next = createNode(105, 238);

    // 创建链表 b
    struct Node* b = createNode(102, 235);
    b->next = createNode(104, 189);
    b->next->next = createNode(106, 244);

    // 打印原始链表
    printf("链表 A:\n");
    printList(a);
    printf("链表 B:\n");
    printList(b);

    // 合并并排序链表
    struct Node* mergedList = mergeLists(a, b);

    // 打印合并后的链表
    printf("\n合并后的链表:\n");
    printList(mergedList);

    return 0;
}

思路:

链表结点结构体:
struct Node 包含学号、成绩以及指向下一个结点的指针。
创建新结点:
createNode(int studentID, float score) 函数用于创建新的链表结点。
合并链表:
mergeLists(struct Node* list1, struct Node* list2) 函数通过比较学号将两个链表合并成一个新的链表,并返回合并后的链表头。
打印链表:
printList(struct Node* head) 函数用于打印链表中的每个结点信息。
主函数:
在 main() 函数中,我们创建两个链表 a 和 b,然后调用合并函数进行合并,并最终打印出合并后的链表。

第一期更新完毕,第二期直接进阶.

个人感受

感谢各位码农的观看,看到这里证明这些题目码农们都掌握了,在这里小猿恭喜你,同时,文章如果有错误的地方请及时指出,相互学习;下期预告:准备出C语言进阶的题目了,希望各大码农支持,下一期见(最近一个月)

经典结尾

路虽远,行则将至;事虽难,做则必成;

你可能感兴趣的:(C语言入门到超神,c语言,蓝桥杯,开发语言)