系列文章目录
文章目录
系列文章目录前言创作不易,你的鼓励,我的动力,学有所成,则是意义;题目第一题.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 <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到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 <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=11*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*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)。例如,12和18的公约数有1、2、3、6,其中最大的是6,所以12和18的最大公约数是6。2.最小公倍数:两个或多个整数的公倍数中最小的一个,记为[a,b]。例如,12和18的公倍数有24、48、72等,其中最小的是24,所以12和18的最小公倍数是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; // 因子之和,默认包含 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 <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 =>多吃一个的2倍3.通关
第二十三题: 一球从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.循环10次3.通关
第二十四题: 两个乒乓球队进行比赛,各出三人。甲队为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=1i=2 j=2i=3 j=6i=4 j=24i=5 j=120i=6 j=720i=7 j=5040i=8 j=40320i=9 j=362880i=10 j=3628800i=11 j=39916800i=12 j=479001600i=13 j=1932053504i=14 j=1278945280i=15 j=2004310016i=16 j=2004189184i=17 j=-288522240i=18 j=-898433024i=19 j=109641728i=20 j=-2102132736
代码:
#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!
答案:
请输入一个数: 6720
代码:
#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个字符,以相反顺序打印出来
答案:
请输入10个字符:asdfghjklo olkjhgfdsa
代码:
#include "stdio.hvoid recursionPrintf(char a[],int i){if(i==-1){return ;}printf("%c",a[i]);recursionPrintf(a,i-1);}main(){char a[11]; //多一个是\0printf("请输入10个字符:");scanf("%s",&a);recursionPrintf(a,10);}
思路:
1.递归:直接调用自己
2.把最大下标传过去依次减一
3.通关
第二十九题:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
答案:
18
代码:
#include "Stdio.hmain(){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:6第 6 年共有 9 头母牛。
代码:
#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; // 第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 71 2 13 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.hmain(){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 <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.使用一个 swapped 标志位来检测是否进行了元素交换,以便在数组已经有序时提前结束排序过程。4.通关
第三十六题:矩阵转置
答案
打印原始矩阵:1 2 3 45 6 7 89 10 11 12打印转置矩阵:1 5 92 6 103 7 114 8 12
代码
#include "stdio.h" #define ROWS 3#define COLS 4void 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 <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指向的字符,直到两个指针相遇,从而实现字符串反转。
第三十九题:使用结构体实现年月日且是多少天
答案:
请输入年份:2024请输入月份:12请输入日期:12024年12月1日是336天
代码:
#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两个链表,每个链表中的结点包括学号、成绩。要求把两个链表合并,按学号升序排列
结果:
链表 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 <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() { // 创建链表 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语言进阶的题目了,希望各大码农支持,下一期见(最近一个月)
经典结尾
路虽远,行则将至;事虽难,做则必成;