C语言的结束只是我们代码人的开始
一、今天是第一天的刷题(加油代码人)
总共有4个题目
1.第一个题目我们讲一讲有关汉偌塔问题的算法
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<math.h> //不使用递归实现 void Hanio_Step(int num, char A, char B, char C) { if (num == 1) { printf("%c->%c\n",A,C);//奇数走A->C 偶数走A->B } else//这个就是除了只有1层剩下的两种情况 1.就是此时的n-1个碟子从A经过C到B 2.就是此时的n-1个碟子从B经过A到C 所以就是按照这个情况一直运行下去 { Hanio_Step(num - 1, A, C, B);//这步的意思就是从A经过C到B printf("%c->%c\n",A,C); Hanio_Step(num - 1, B, A, C);//这步的意思就是从B经过A到C } } int main() { int num; scanf("%d",&num); printf("完成%d层的汉偌塔需要%d步\n",num,(int)pow(2,num)-1); //这边重新包装一个函数来实现汉偌塔的移动的步骤的打印 Hanio_Step(num, 'A', 'B', 'C'); return 0; }
(1.)汉偌塔问题属实是值得花时间好好搞一下的
(2.)这边通过给你们举一个完成2层汉偌塔的移动的过程,剩下了都是一个道理
(3.)如图
2.第二个题目是关于杨辉三角的一点小算法
#include<stdio.h> void yhtri(int line) { int i, j; int arr[20][20] = { 0 };//首先创建一个二维数组 for (i = 0; i <= line-1; i++) { if (i == 0) arr[0][0] = 1; else if (i == 1) { arr[1][0]; arr[1][1]; } else { for (j = 1; j < i; j++) { arr[i][0]=1; arr[i][i]=1; arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];//实现三角形中各个数字的相加 } } } for (i = 0; i < line; i++) { for (j = line; j > i + 1; j--)//这步可以重点理解一下 { printf(" "); } for (j = 0; j <= i; j++) { printf("%-6d",arr[i][j]); } printf("\n"); } } int main() { int line; printf("请输入杨辉三角的行数:"); scanf("%d",&line); yhtri(line); return 0; }
(1.)具体的原理就是运用到了杨辉三角的几个特点
1.每行的端点和结尾处的数都为1
2.每行数字左右对称,由1开始逐渐变大
3.第n行就有n项
4.每个数字等于上一行的左右两个数字之和(假如此时的这个数的坐标是 arr[ i ][ j ],则这个数的值就是等于arr[ i-1 ] [ j ]和arr[ i-1 ] [ j-1 ] 这两个左边的数字的和),用中文来说就是,这个数等于上一行本列和上一行上一列的数字的和
(2.)所以此时利用杨辉三角的这几个特点就可以很好的将其用C语言的方式给编译出来了
3.第三个题目就是关于质数的题目
题目具体如下:
小A有一个质数口袋,里面可以装各个质数。他从2开始,依次判断各个自然数是不是质数,如果是质数就会把这个数字装入口袋。口袋的负载量就是口袋里的所有数字之和。但是口袋的承重量有限,不能装得下总和超过 L 的质数。给出 L,请问口袋里能装下几个质数?将这些质数从小往大输出,然后输出最多能装下的质数个数,所有数字之间有一空行。
(1.)这个题目主要就是考我们的阅读理解能力和基础知识的运用,所以你可以自己去尝试着写一下
可以先不看,看看自己能写多少,如果有个别不懂的地方可以进行参考:
(2.)具体代码如下:
#include<stdio.h> int main() { int i = 0; int sum = 0; int count = 0; int arr[1024] = { 0 }; int L = 0; scanf("%d", &L); for (i = 2; ; i++) { int j = 0; for (j = 2; j < i; j++) { if (i % j == 0) { break; } } if (i == j) { printf("%d\n", i); printf("\n"); sum += i; arr[count] = i; count++; } if (sum >= L) { count = count - 1; sum -= arr[count]; break; } } printf("%d\n",count); printf("\n"); printf("%d\n",sum); return 0; }
打印结果如下:
(3.)超详注释如下(6个变量定义法则)帮你快速拥有解题技巧,一个变量一个两边的定义
图片截成两张,以防太小:
(4.)以上就是这个有关质数的题目的注释
4.第四个题目就是关于数组排序的题目
(1.)代码如下:
#include<stdio.h> int main() { int i, j,n,tmp; int arr[1024] = { 0 }; scanf("%d",&n); for (i = 0; i < n ; i++) { scanf("%d",&arr[i]); } for (i = 0; i < n - 1; i++) { for (j = 0; j < n - i - 1; j++) { if (arr[j] > arr[j + 1]) { tmp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = tmp; } } } for (i = 0; i < n; i++) { printf("%d ", arr[i]); } return 0; }
(2.)大致就是冒泡排序的思想,但是要注意的一点就是在我输入5个数的时候,可以使用循环输入的方法,然后放进数组中的方法
5.总结:做题贵在坚持,你的耐心和你的时间就是你的智慧,所以不要认为自己学不会(但是更不能觉得自己有多厉害,我们只是代码人……),算法贵在坚持,加油!这就是我第一天做的题,明天我们继续做别的题。