C语言编程49题
乐行僧丶
这个作者很懒,什么都没留下…
展开
-
37-杨辉三角
思路:本质是递推,可以动态规划做对于杨辉三角的任意一行,第一个和最后一个元素都是1中间的元素是由其肩膀上两个元素之和。代码实现:#include <stdio.h>#include <stdlib.h>#define N 10int* f[N];void Generate() { for (int i = 0; i < N; i++) { int* line = malloc(sizeof(int) * (i + 1));原创 2021-12-02 15:48:41 · 485 阅读 · 0 评论 -
31-三色旗问题(荷兰国旗问题)
思路:使用三个指针维护三个区间代码实现:#include <stdio.h>typedef enum { BLUE = 1, WHITE = 2, RED = 3} Color;Color arr[] = {RED, BLUE, RED, WHITE, WHITE, RED, WHITE, BLUE, BLUE, RED, WHITE};void Swap(Color* arr, int i, int j) { Color t = arr[原创 2021-12-02 15:30:14 · 1077 阅读 · 0 评论 -
29-约瑟夫环问题
代码#include <stdio.h>/*编号为 1,2,3,…,n 的 n 个人围坐一圈,任选一个正整数 m 作为报数上限值,从第一个人开始按顺时针方向报数,报数到 m 时停止,报数为 m 的人出列。从出列人的顺时针方向的下一个人开始又从 1 重新报数,如此下去,直到所有人都全部出列为止。*/int LastRemain(int n, int m) { if (n == 1) { return 0; } return (LastRe原创 2021-11-30 06:45:08 · 128 阅读 · 0 评论 -
30-整数逆序输出
思路递归体 先递归,后输出边界条件代码#include <stdio.h>/* * 将一个从键盘输入的整数存放到一个数组中,通过程序的运行按照数组中的逆序输出该整数,利用递归的方法解决问题。 * */void Print(int* a, int n, int u) { if (u == n) { return; } Print(a, n, u + 1); printf("%d", a[u]); if (u ==原创 2021-11-28 21:34:58 · 692 阅读 · 0 评论 -
28-输出等腰三角形
思路每行前输出空格的数量每行空格后*的数量每行后注意输出换行符代码#include <stdio.h>/*本实例要求从键盘输入任意整数 n,通过程序运行输出对应高度为 n 的等腰三角形 */void PrintTriangle(int n) { // 输出几行 for (int i = 0; i < n; i++) { // 输出每行前的空格 for (int j = 0; j < n - i -1; j++)原创 2021-11-28 09:02:48 · 544 阅读 · 0 评论 -
27-字符串加密和解密算法
思路根据题意,思路是比较好想的,但是要注意以下两点加密时,要注意偏移之后的值(下标 + 5)不能超能ascii码所能表示的范围。解秘时,要注意偏移之后的值(下标 - 5)不能小于0,所以需要加上N然后取模。代码#include <stdio.h>#include <string.h>/* * 在本实例中要求设计一个加密和解密算法。 * 在对一个指定的字符串加密之后,利用解密函数能够对密文解密,显示明文信息。 * 加密的方式是将字符串中每个字符加上它在字符串中原创 2021-11-28 08:28:45 · 1764 阅读 · 0 评论 -
26-统计单词个数
思路在字符串中一个完整单词的特征?空格前且空格前是字符换行符前且空格前是字符代码#include <stdio.h>#include <string.h>#include <ctype.h>int count(char* s) { int n = strlen(s); int i = 0; int cnt = 0; for (i = 0; i < n; i++) { if (isalpha(s[原创 2021-11-27 08:01:53 · 201 阅读 · 0 评论 -
23-狼追兔子问题
思路环形遍历数组,要对下标取数组长度的模,防止越界代码#include <stdio.h>#include <string.h>#define N 10int main() { int i = 0; int f[N] = {0}; // 1 3 6 10 15 21 int d = 0; for (i = 0; i < N; i++) { f[d] = 1; d++; d原创 2021-11-25 08:02:37 · 550 阅读 · 0 评论 -
22-兔子生兔子问题
题目假设一对兔子的成熟期是一个月,即一个月可长成成兔,那么,如果每对成兔每个月都生一对小兔,一对新生的小兔从第二个月起就开始生兔子,试问从一对兔子开始繁殖,以后每个月会有多少对兔子?思路斐波那契数列模型本题考点:动态规划状态表示:f[i]表示在i月的时候有多少对兔子(包括成熟的不成熟的)状态计算:f[i] = f[i - 1] + f[i - 2]; f[i - 1]表示i-1个月兔子对的数量,f[i - 2]表示i-2个月兔子对的数量;因为第i-2月的兔子对数量到这月已经成为成熟兔子对,原创 2021-11-25 07:22:23 · 1679 阅读 · 0 评论 -
21-矩阵转置
题目利用数组解决线性代数中的矩阵转置问题。设有一矩阵为m×n阶即m行n列),第i行j列的元素是a(i,j),需要将该矩阵转置为n×m阶的矩阵,使其中元素满足 b(j,i)=a(i,j)。思路:没啥好说的代码:#include <stdio.h>#include <stdlib.h>#define N 100int a[N][N];int b[N][N];void transpose(int a[N][N], int b[N][N], int m, int原创 2021-11-24 09:16:11 · 608 阅读 · 0 评论 -
20-判断年份是否为闰年
思路:什么是闰年?可以被400整除,或者可以被4整除但是不能被100整除的年份闰年的定义就是一个逻辑表达式((x % 400 == 0) || ((x % 4 == 0) && (x % 100 !=0)))代码:#include <stdio.h>typedef int bool;#define true 1#define false 0bool IsLeapYear(int x) { return ((x % 400 == 0) || (原创 2021-11-24 07:06:40 · 308 阅读 · 0 评论 -
19-求回文素数
思路这里需要解决两个问题:什么是素数什么是回文数素数:素数一般指质数,质数定义是一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;回文数:任意的整数,当从左向右读与从右向左读是相同的;代码#include <stdio.h>#include <stdlib.h>#include <string.h>/*求1000以内的所有回文素数。*/#define bool int#define true 1#defin原创 2021-11-23 17:32:59 · 666 阅读 · 0 评论 -
14-判断三角形的类型
思路面积:海伦公式判断三角形:小学数学知识!代码#include <stdio.h>#include <math.h>double area(int a, int b, int c) { double p = (a + b + c) / 2.0; return (double) sqrt(p * (p - a) * (p - b) * (p - c));}void solve(int a, int b, int c) { // 构成三角原创 2021-11-22 22:46:23 · 158 阅读 · 0 评论 -
12-分块查找
思路:块内无序,块间有序块间可以使用二分可以用块关键字代替整个块的性质,提高的查找速度代码:#include <stdio.h>#include <limits.h>/*块内无序,块间有序*/typedef struct block { int key; int start; int end;} block_t;#define N 4 // N个块block_t table[N];int max(int x, int原创 2021-11-22 09:24:49 · 252 阅读 · 0 评论 -
16-最大公约数和最小公倍数
思想:辗转相除代码:#include <stdio.h>int gcd(int a, int b) { return b ? gcd(b, a % b) : a;}int gcd2(int a, int b) { while (b) { int c = a % b; a = b; b = c; printf("a = %d, b = %d, c = %d\n", a, b, c); }原创 2021-11-21 08:11:20 · 475 阅读 · 0 评论 -
17-求自然底数e
思路e^x的泰勒展开式代码#include <stdio.h>#define D 1e-10 // 精度int main() { int i = 1; double ans = 1.0, n = 1.0; while (1/n > D) { ans += 1/n; i++; n = n * i; } printf("%f\n", ans); return 0;}...原创 2021-11-21 08:14:25 · 497 阅读 · 0 评论 -
15-水仙花数,阿姆斯特朗数
#include <stdio.h>#include <stdio.h>#include <string.h>#include <math.h>/*阿姆斯特朗数也就是俗称的水仙花数,是指一个三位数,其各位数字的立方和等于该数本身。例如:153=1^3+5^3+3^3,所以 153 就是一个水仙花数。求出所有的水仙花数。*/#define bool int#define true 1#define false 0bool IsNarc原创 2021-11-20 08:48:09 · 347 阅读 · 0 评论 -
11-二分查找算法
思想:利用有序的特点,平均意义上,每次查找缩减一般的查找规模,进而提高查找速度。关键点:存储结构为顺序存储,且关键字之间有序l <= r,不能l < r中间下标计算溢出问题,m = (l + r)/2 可能会溢出,使用减法,m = (r - l)/2 + l代码:#include <stdio.h>int BinSearch(int *a, int n, int t) { int l = 0; int r = n - 1; while (原创 2021-11-20 08:36:54 · 526 阅读 · 0 评论 -
10-归并排序算法
思想:分治 + 归并通过分治缩减排序规模,然后再将分治后的答案进行归并,逐渐得到原答案。注意点:稳定的排序算法时间复杂度O(nlog2n)空间复杂度O(n)非递归实现,自定上下注意分治和归并中数组中间位置下标的对应关系应用:逆序对个数的求解代码:#include <stdio.h>#include <stdlib.h>typedef int bool;#define true 1#define false 0void swap(int *a, i原创 2021-11-19 07:45:38 · 210 阅读 · 0 评论 -
9-选择排序算法
思想:依次遍历数组的每一个元素,在该元素之后寻找一个比其小/大的一个最小值/最大值,记录下标。退出循环时进行交换。注意点:不稳定的排序算法代码:#include <stdio.h>typedef int bool;#define true 1#define false 0void swap(int *a, int* b) { int t = *a; *a = *b; *b = t;}void show(int *a, int n) {原创 2021-11-19 07:32:23 · 209 阅读 · 0 评论 -
4-渔夫打鱼晒网问题
题目:如果一个渔夫从 2011 年 1 月 1 日开始每三天打一次渔,两天晒一次网。编程实现当输入 2011 年 1 月 1 日以后的任意一天,输出该渔夫是在打渔还是在晒网。思路:1.计数, 2011 年 1 月 1 日到今天经过了多少天。2.对1求出的天数模5,余数为0,1,2是打渔,余数是3,4是筛网。3.细节,闰年二月与平年二月天数不同,不需要特判。闰年2月29天,平年2月28天。4.细节,什么是闰年。分为一下这两种情况;可以被400整除;可以被4整除但是不能被100整除;代码:#i原创 2021-11-18 08:24:04 · 719 阅读 · 0 评论 -
8-快速排序算法
思想:使用划分函数讲待排序序列划分三个部分,[l, p-1] < e e [p+1, r] > e, 其中元素e的位置已经确定,然后分别递归处理两个部分,直到整个区间全部处理完成。一些关键点:不稳定的排序算法初始状态待排序序列基本有序,快速排序的时间复杂度为O(n^2),性能非常差空间复杂度与递归树的高度成正比,平均来看是O(log2n)划分函数的选择非常重要优化,随机划分,当基本有序时采用插入排序,使用更好的划分函数代码:#include <stdio.h>原创 2021-11-18 08:04:59 · 342 阅读 · 0 评论 -
7-直接插入排序算法
思想:将待排序数组看作是有序和无序两部分。初始状态,有序部分只有一个元素,其余数组元素均属于无序部分的。按照顺序每次从无序的部分数组中选择一个元素将其插入在有序部分数组合适的位置上即可。数组元素基本有序时,直接插入排序时间复杂度接近与O(n),性能非常好。#include <stdio.h>void show(int *a, int n) { int i = 0; for (i = 0; i < n; i++) { printf("%d",原创 2021-11-17 18:50:37 · 432 阅读 · 0 评论 -
6-冒泡排序算法
思想:两两比较每轮循环选择一个最大或者最好的放置其位置上。稳定的排序。优化:如果已经有序,及时退出,减少不必要的循环。#include <stdio.h>void show(int *a, int n) { int i = 0; for (i = 0; i < n; i++) { printf("%d", a[i]); if (i != n - 1) { printf(" "); }原创 2021-11-17 18:42:53 · 123 阅读 · 0 评论 -
5-希尔排序算法
思想:增量排序,先部分有序,然后整体有序。与插入排序的思想是一致的。不稳定的排序算法#include <stdio.h>void show(int *a, int n) { int i = 0; for (i = 0; i < n; i++) { printf("%d", a[i]); if (i != n - 1) { printf(" "); } } printf("原创 2021-11-17 18:35:51 · 96 阅读 · 0 评论 -
3-百钱买百鸡问题
题目中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱买百鸡问题”,鸡翁一,值钱五, 一只公鸡 5鸡母一,值钱三, 一只母鸡 3鸡雏三,值钱一, 三只小鸡 1百钱买百鸡,问翁、母、雏各几何?思路暴力枚举1.全买公鸡,最多买20只2.全买母鸡,最多买33只,此时至少买三只小鸡3.全买小鸡,最多买300只代码int main() { int i, j, k; for (i = 0; i <= 20; i++) { for (j = 0; j原创 2021-11-16 18:08:43 · 383 阅读 · 0 评论 -
2-猴子吃桃问题
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将第一天剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半减一个。到第 10 天早上想再吃时,发现只剩下一个桃子了。编写程序求猴子第一天摘了多少个桃子。思路:递推:设x2是当前天的桃子个数,x1是前一天的桃子个数x2 = (x1/2)-1 => x1 = (x2+1)*2int main() { int cnt = 9;// 递推的次数 int x2原创 2021-11-16 18:04:51 · 209 阅读 · 0 评论 -
1-三个数从下到大排序输出
思路1.a和b的最大值,a和c的最大值以及b和c的最大值,三者中的最大即为最大。2.a和b的最小值,a和c的最大值以及b和c的最小值,三者中的最小即为最小。3.中间值,枚举a,b,c,满足x > mi && x < mx即为中间值。#include <stdio.h>int max(int a, int b) { return a > b ? a : b;}int min(int a, int b) { return a <原创 2021-11-16 18:01:16 · 108 阅读 · 0 评论