cBlueBridgeCup Created 2024-12-01 | Updated 2024-12-01
| Post View:
一、 经典开场
权衡利弊这麽久得到你想要的了嘛.
前言
蓝桥杯看着很简单实际有点难度,只有自己熟练掌握语法之后再去刷算法题才可以游刃有余.
创作不易,你的鼓励,我的动力,学有所成,则是意义; 题目 第一题.1, 2, 3, 4 能组成多少个互不相同且无重复数字的三位数?都是多少? 结果:
1 2 - 可以组成 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 #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又是一个完全平方数,请问该数是多少? 结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #include <stdio.h> #include <math.h> main() { int x; for (x = 0 ; x <= 10000 ; x++) { int a_square = x + 100 ; int b_square = x + 268 ; 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" ); }
思路
1 2 3 - 完全平方数检测: - 使用 sqrt () 函数计算平方根,并将结果转换为整数。 - 检查 ( a ) 和 ( b ) 的平方是否分别等于 ( x + 100 ) 和 ( x + 268 )。
第三题: 输入某年某月某日,判断这一天是这一年的第几天? 结果:
1 2 3 4 5 - 输入: - year:2000 - month:12 - day:6 - 结果: 341
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #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 - 1. 区分平年和闰年 - 2. 把每一年的天数加起来 - 3. 最后在输出
第四题:输入三个整数X,Y,Z,请把这三个数由小到大输出 结果:
1 2 3 4 5 - 输入: - x: 200 - y: 12 - z: 600 - 结果: 12 200 600
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #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); }
思路
第五题:C语言用*号输出字母C的图案 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #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 2 3 4 5 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 图形:
代码:
1 2 3 4 5 6 7 8 9 10 11 12 #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 >1. 外层循环控制行数 >2. 内层循环控制空格和* >3. 答案直接出来
第七题:C语言用*号输出图案 3 图形:
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #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 4 >1. 外层循环控制行数 >2. 内层循环控制空格和* >3. 多写一个For循环 >4. 答案直接出来
第八题:C语言用号输出图案=>输入菱形的高度,若为奇数,用 勾勒出棱形,否则输出报错 图形:
1 2 3 4 5 6 输入:5 * * * * * * * *
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 #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 3 4 5 >1. 整体思考如何将图形拆开/2 >2. 外层循环控制行数 >3 内层循环控制空格和* >4. 多写一个For循环 >5. 答案直接出来
第九题:C语言用*号输出图案=>时空沙漏 图形:
1 2 3 4 5 6 ***** *** * *** *****
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #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 4 >1. 外层循环控制行数 >2. 内层循环控制空格和* >3. 多写一个For循环 >4. 答案直接出来
第十题:C语言用九九乘法表 图形:
代码:
1 2 3 4 5 6 7 8 9 #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 >1. 外层循环控制行数 >2. 内层循环控制数字 >3. 答案直接出来
第十一题:C语言输出国际象棋棋盘 图形:
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #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 4 >1. 外层循环控制棋盘的宽 >2. 内层循环控制棋盘的高 >3. 加起来的和取模2 等于0 这输出一个#号 >4. 答案直接出来
第十二题:打印楼梯,同时在楼梯上方打印两个笑脸。 图形:
这个不好画出来,运行一下代码
代码:
1 2 3 4 5 6 7 8 9 10 11 #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 >1. 外层循环控制行数 >2. 内层循环控制楼梯的*号数量 >3. 答案直接出来
第十三题: 兔子生崽:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前30个月即可) 答案:
第 30 个月兔子总数有: 832040 只
1 2 3 4 5 6 7 8 9 10 11 12 #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 >1. 定义数组 >2. 斐波拉契数列 >3. 答案出来了
第十四题:判断101到200之间的素数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 素数: 只能被1 和它本身整除 素数:101 素数:103 素数:107 素数:109 素数:113 素数:127 素数:131 素数:137 素数:139 素数:149 素数:151 素数:157 素数:163 素数:167 素数:173 素数:179 素数:181 素数:191 素数:193 素数:197 素数:199
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #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的三次方 答案:
1 2 3 4 水仙花:153 水仙花:370 水仙花:371 水仙花:407
代码:
1 2 3 4 5 6 7 8 9 10 11 12 #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.答案出来了
第十六题:输入一个数,求他的质因数; 答案:
1 2 3 4 5 质因数:将一个数分解成若干个质数之积的过程 比如 30 = 2 *3 *5 8 = 2 *2 *2 520 = 2 *2 *2 *5 *13
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 方法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 ("*" ); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 方法2 : 函数 #include "stdio.h" int isWaterFairyFlower (int 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 ; } } } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 方法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 3 4 5 6 7 1. 知道什么是质因数(如果一个数的因数是质数,那么这个因数就是他的质因数)2. 什么是分解质因数(把一个合数用质数相乘的形式表示出来,叫作分解质因数。)分解的过程: > 首先,对正整数n进行分解因数,先找到一个最小的质数 > 其次,该正整数n为质数,则说明不需要分解 > 最后,如果该正整数n不是质数,但是能被最小的质数整除,就应该打印最小质数的值.
第十七题:利用条件运算符的嵌套来完成此题:学习成绩> = 90分的同学用甲表示,60-89分之间的用乙表示,60分以下的用?表示 答案:
1 2 3 4 5 6 7 #include "stdio.h" main(){ int score,i; printf ("请输入一个成绩" ); scanf ("%d" ,&score); score>=90 ? printf ("甲" ): (score>=60 && score<90 ) ? printf ("乙" ):printf ("?" ); }
思路
1 2 3 1. 读懂题意2. 知道条件运算符3. 答案出来了
第十八题:输入两个正整数,求其最大公约数和最小公倍数 思路:
1 2 3 4 1. 最大公约数:两个或多个整数的公约数中最大的一个,记为(a,b)。 例如,12 和18 的公约数有1 、2 、3 、6 ,其中最大的是6 ,所以12 和18 的最大公约数是6 。 2. 最小公倍数:两个或多个整数的公倍数中最小的一个,记为[a,b]。 例如,12 和18 的公倍数有24 、48 、72 等,其中最小的是24 ,所以12 和18 的最小公倍数是36 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #include "stdio.h" main(){ 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); }
第十九题:输入一行字符,分别统计出其中英文字母,空格,数字和其它字符的个数 答案:
1 2 输入:asb 123 输出:字符:3 空格 1 数字 123
代码1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 方法一 #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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 #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 2 3 1. 注意scanf 和 gets区别 重要:gets可以接收空格;而scanf 遇到空格、回车和Tab键都会认为输入结束,所有它不能接收空格 2. 通关
第二十题:求S = A + AA + AAA + AAAA + AA …一个的值,其中一个是一个数字。例如2 + 22 + 222 + 2222 + 22222(此时共有5个数相加),几个数相加有键盘控制 结果:
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #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的数字" ); }
思路:
第二十一题:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6 = 1 + 2 + 3.编程找出1000以内的所有完数。 答案:
1 2 3 4 1 是完数6 是完数28 是完数496 是完数
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #include <stdio.h> main() { int sum,i,j; for ( i = 1 ; i <= 1000 ; i++) { sum = 1 ; for ( j = 2 ; j <= i / 2 ; j++) { if (i % j == 0 ) { sum += j; } } if (sum == i) { printf ("%d 是完数\n" , i); } } }
思路:
第二十二题:猴子吃桃问题=》猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。 答案: 1534
代码:
1 2 3 4 5 6 7 8 9 10 #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 3 1. 找规律2. 逆向思维:(x+1 )*2 =>多吃一个的2 倍3. 通关
第二十三题: 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米第10次反弹多高? 答案:
1 2 3 结果: 第10 次落地,共经过299.80 米 第10 次落地反弹0.10 米
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 #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 2 3 1.100 米高 和 反弹原来的一半2. 循环10 次3. 通关
第二十四题: 两个乒乓球队进行比赛,各出三人。甲队为A,B,C三人,乙队为X,Y,Z三人。已抽签决定比赛名单。有人向队员打听比赛的名单.A说他不和X比,C说他不和X,Z比,请编程序找出三队赛手的名单 结果:三队赛手的名单:Z X Y
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 方法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); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 方法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!的和。 答案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 前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
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <stdio.h> 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! 答案:
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 #include <stdio.h> 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个字符,以相反顺序打印出来 答案:
1 2 请输入10 个字符:asdfghjklo olkjhgfdsa
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 #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
代码:
1 2 3 4 5 6 7 8 #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 是回文数
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #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年的时候,共有多少头母牛? 答案:
1 2 请输入年份 n:6 第 6 年共有 9 头母牛。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include <stdio.h> 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 ; cows[2 ] = 1 ; cows[3 ] = 1 ; 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 2 3 4 5 6 第 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 方法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]); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 方法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 3 4 5 6 输入: 1 2 7 1 2 1 3 2 3 输出: 6 12
代码:
1 2 3 4 5 6 7 8 9 10 11 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 ]); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 方法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 2 3 4 5 原始已排序数组: 1 3 5 7 9 12 14 17 20 请输入要插入的数:96 插入后的数组: 1 3 5 7 9 12 14 17 20 96
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 #include "stdio.h" #define SIZE 10 main() { int arr[SIZE] = {1 , 3 , 5 , 7 , 9 , 12 , 14 , 17 , 20 }; 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 2 3 4 5 6 7 8 9 10 11 1. 初始化数组: 创建一个大小为 10 的数组,其中前 9 个元素已经按升序排列,最后一个元素将用于存放新插入的数字。 2. 输入新数: 提示用户输入要插入的新数。 3. 查找插入位置: 从数组的最后一个元素开始向前遍历,寻找合适的位置以保持数组的排序。将大于新数的元素依次向后移动。 4. 插入新数: 在找到的合适位置插入新数。 5. 输出结果: 打印插入后的数组。 6. 通关
第三十五题:已有一个10个元素的数组,要求按原来排序的规律将它排序(冒泡排序) 答案:
1 2 3 4 原始数组: 13 14 52 12 22 11 90 排序后数组: 11 12 13 14 22 52 90
代码: 方法1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #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]); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 方法2 #include <stdio.h> 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 4 1. 接收一个整数数组和数组的大小作为参数。2. 外层循环控制排序的轮数,内层循环进行相邻元素的比较与交换。3. 使用一个 swapped 标志位来检测是否进行了元素交换,以便在数组已经有序时提前结束排序过程。4. 通关
第三十六题:矩阵转置 答案
1 2 3 4 5 6 7 8 9 打印原始矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 打印转置矩阵: 1 5 9 2 6 10 3 7 11 4 8 12
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 #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.通关
第三十七题:字符串连接 答案:
1 2 3 请输入第二个字符串:asdfghjkl 请输入第一个字符串:padsjd 打印连接字符串:asdfghjklpadsjd
代码
1 2 3 4 5 6 7 8 9 10 11 12 #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 2 3 1. 用了一个string 库2. 使用以及写好的库函数3. 通关
第三十八题:自定义函数反转字符串 答案:
1 2 3 请输入一个字符串:asdfghjkl 原始字符串: asdfghjkl 反转后的字符串: lkjhgfdsa
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #include <stdio.h> #include <string.h> 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指向的字符,直到两个指针相遇,从而实现字符串反转。
第三十九题:使用结构体实现年月日且是多少天 答案:
1 2 3 4 请输入年份:2024 请输入月份:12 请输入日期:1 2024 年12 月1 日是336 天
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 #include "stdio.h" struct Date { int year; int month,day; }; int countDayOfYear (struct Date date) { int daysInMonth[] = {31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 }; if ((date.year % 4 == 0 && date.year % 100 != 0 ) || (date.year % 400 == 0 )){ daysInMonth[1 ] = 29 ; } if (date.month<1 || date.day<1 ||date.month>12 || date.day> daysInMonth[date.month] ) { printf ("日期无效!" ); } int dayOfYear = 0 ,i; for (i=1 ;i<date.month;i++){ dayOfYear += daysInMonth[i]; } dayOfYear +=date.day; return dayOfYear; } main(){ struct Date date ; printf ("请输入年份:" ); scanf ("%d" , &date.year); printf ("请输入月份:" ); scanf ("%d" , &date.month); printf ("请输入日期:" ); scanf ("%d" , &date.day); int dayOfYear = countDayOfYear(date); printf ("%d年%d月%d日是%d天" ,date.year,date.month,date.day,dayOfYear); }
思路:1.明白结构体2.判断闰年3.通关
第四十题:已有a、b两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列 结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 链表 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
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 #include <stdio.h> #include <stdlib.h> 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 () { struct Node * a = createNode(101 , 215 ); a->next = createNode(103 , 175 ); a->next->next = createNode(105 , 238 ); 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 ; }
思路:
1 2 3 4 5 6 7 8 9 10 链表结点结构体: struct Node 包含学号、成绩以及指向下一个结点的指针。创建新结点: createNode (int studentID , float score ) 函数用于创建新的链表结点。合并链表: mergeLists (struct Node * list1 , struct Node * list2 ) 函数通过比较学号将两个链表合并成一个新的链表,并返回合并后的链表头。打印链表: printList (struct Node * head ) 函数用于打印链表中的每个结点信息。主函数: 在 main () 函数中,我们创建两个链表 a 和 b ,然后调用合并函数进行合并,并最终打印出合并后的链表。
第一期更新完毕,第二期直接进阶. 个人感受 感谢各位码农的观看,看到这里证明这些题目码农们都掌握了,在这里小猿恭喜你,同时,文章如果有错误的地方请及时指出,相互学习;下期预告:准备出C语言进阶的题目了,希望各大码农支持,下一期见(最近一个月)
经典结尾 路虽远,行则将至;事虽难,做则必成;