湖南吉首建设官方网站,广州东站建站时间,wordpress调用最新评论,电子商务网站建设的具体内容c语言基础程序——经典100道实例 001#xff0c; 组无重复数字的数002#xff0c;企业发放的奖金根据利润提成003#xff0c;完全平方数004#xff0c;判断当天是这一年的第几天005#xff0c;三个数由小到大输出006#xff0c;输出字母C图案007#xff0c;特殊图案008 组无重复数字的数002企业发放的奖金根据利润提成003完全平方数004判断当天是这一年的第几天005三个数由小到大输出006输出字母C图案007特殊图案0089*9 乘法表009国际象棋棋盘010打印笑脸011兔子生崽012101到200的素数013水仙花数014分解质因数015(ab)?a:b016最大公约数和最小公倍数017统计字母、数字等018saaaaaa...019完数020小球自由下落021猴子吃桃问题022乒乓球推理023打印菱形0242/13/25/3...025求阶乘的和026递归求阶乘027逆序打印字符028岁数推理029逆序打印各位数字030判断是否回文数031判断星期几032删字符串中的指定字母033判断是否质数034练习函数调用035字符串反转036100内的素数037排序038矩阵对角元素和039一个数插入数组040数组逆序输出041static用法1042auto用法043static用法2044extern的使用045register用法046宏#define练习1047宏#define练习2048宏#define练习3049#if,#ifdef,#ifndef050#include练习051按位与 052按位或 | 001 组无重复数字的数
题目 有 1、2、3、4 四个数字能组成多少个互不相同且无重复数字的三位数
问题分析 先在百位数选择一个数字接着在十位上选择一个数字最后在个位上选择一个数字但要保证每次选择的三个数字都互不相同使用三个for循环即可找出这样的数字。
/*** Created by 公众号数据结构和算法* Copyright © wansuanfa.com All rights reserved.*/#includestdio.h // 标准的输入输出头文件int main() {for (int i 1; i 5; i) { // 先选择百位上的数字for (int j 1; j 5; j) {// 接着选择十位上的数字for (int k 1; k 5; k) { // 最后选择个位上的数字// 选择的三个数字必须都互不相同if (i ! j i ! k j ! k) {printf(%d%d%d\n, i, j, k);}}}}return 0;
}优化上面代码中也可以在for循环的时候判断是否有重复的数字如果有则直接跳过。
运行结果
123
124
132
134
142
143
213
214
231
234
241
243
312
314
321
324
341
342
412
413
421
423
431
432002企业发放的奖金根据利润提成
利润 i 低于或等于10万元时奖金可提10%利润高于10万元低于20万元时低于10万元的部分按10%提成高于10万元的部分可提成7.5%20万到40万之间时高于20万元的部分可提成5%40万到60万之间时高于40万元的部分可提成3%60万到100万之间时高于60万元的部分可提成1.5%高于100万元时超过100万元的部分按1%提成。
从键盘输入当月利润 i 求应发放奖金总数
问题分析 根据利润的区间让数字在不同的区间分别单独计算。
/*** Created by 公众号数据结构和算法* Copyright © wansuanfa.com All rights reserved.*/#includestdio.hint main() {double i;// 利润double bonus 0;// 奖金printf(当月利润是);scanf(%lf, i);// 输入当月利润double bonus1 100000 * 0.1;// 十万的奖金double bonus2 bonus1 100000 * 0.075;// 二十万的奖金double bonus4 bonus2 200000 * 0.05;// 四十万的奖金double bonus6 bonus4 200000 * 0.03;// 六十万的奖金double bonus10 bonus6 400000 * 0.015;// 一百万的奖金if (i 100000) {// 利润 i 低于或等于10万元时奖金可提10%bonus i * 0.1;} else if (i 200000) {// 低于10万元的部分按10%提成高于10万元的部分可提成7.5%bonus bonus1 (i - 100000) * 0.075;} else if (i 400000) {// 20万到40万之间时高于20万元的部分可提成5%bonus bonus2 (i - 200000) * 0.05;} else if (i 600000) {// 40万到60万之间时高于40万元的部分可提成3%bonus bonus4 (i - 400000) * 0.03;} else if (i 1000000) {// 60万到100万之间时高于60万元的部分可提成1.5%bonus bonus6 (i - 600000) * 0.015;} else if (i 1000000) {// 高于100万元时超过100万元的部分按1%提成。bonus bonus10 (i - 1000000) * 0.01;}printf(应发奖金为bonus%lf, bonus);return 0;
}运行结果
当月利润是350000
应发奖金为bonus25000.000000003完全平方数
题目 一个整数它加上100后是一个完全平方数再加上168又是一个完全平方数请问该数是多少
问题分析
假设该数为 x。
1、则 x 100 mx 100 168 n其中 m 和 n 都是完全平方数。
2、设 n a2m b2则 n - m (a b)(a - b) 168因为ab和a-b具有相同的奇偶性又因为168是偶数所以ab和a-b都是偶数。
3、设 ab2*ia-b2*j可得 i * j 168/442。
4、接下来只需要枚举 i 从 1 到 42 即可根据上面的公式我们也可以得出 a i jb i - j进一步又可以得出 m n 以及 x 的值。
/*** Created by 公众号数据结构和算法* Copyright © wansuanfa.com All rights reserved.*/#include stdio.hint main() {// 枚举 i 从 1 到 42 。for (int i 1; i 42; i) {if (42 % i 0) { // 要满足i*j42int j 42 / i; // 计算 j 的值。if (i j) {// 根据 i 和 j 可以计算 a b 以及 x 的值。int a i j;int b i - j;int x b * b - 100;printf(%d 100 %d * %d\n, x, b, b);printf(%d 268 %d * %d\n, x, a, a);}}}return 0;
}运行结果
-99 100 1 * 1
-99 268 13 * 13
21 100 11 * 11
21 268 17 * 17
261 100 19 * 19
261 268 23 * 23
1581 100 41 * 41
1581 268 43 * 43004判断当天是这一年的第几天
题目 输入某年某月某日判断这一天是这一年的第几天
问题分析 先计算当月之前的总天数然后再加上当月的天数。比如10月16号先计算9月(包含9月)之前的总天数然后加上10月的16天最后在判断是否是闰年如果是闰年并且输入的月份大于 2 要多加一天。
/*** Created by 公众号数据结构和算法* Copyright © wansuanfa.com All rights reserved.*/#include stdio.hint main() {// 每月的天数其中2月先暂定为28天。const int daysInMonth[] {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int day, month, year, total;printf(请输入年月日格式为年,月,日2024,10,16\n);scanf(%d,%d,%d, year, month, day); // 格式为2024,10,16total 0; // 计算输入月份之前的总天数for (int i 0; i month - 1; i)total daysInMonth[i];total day;// 加上当月的天数// 判断是否为闰年int leap (year % 400 0) || (year % 4 0 year % 100 ! 0);// 如果是闰年且月份大于2, 总天数加一天if (leap month 2)total;printf(这是这一年的第 %d 天。, total);return 0;
}运行结果
请输入年月日格式为年,月,日2024,10,16
2024,10,16
这是这一年的第 290 天。005三个数由小到大输出
题目 输入三个整数 x、y、z请把这三个数由小到大输出。
问题分析 先用 x 和 y z 比较只要比它俩小就交换这样就可以保证 x 是这三个数中最小的。然后用 y 和 z 比较把最大值保存在 z 中这样 x、y、z 就是从小到大的了。
/*** Created by 公众号数据结构和算法* Copyright © wansuanfa.com All rights reserved.*/#include stdio.h// 交换两个变量的值
void swap(int *a, int *b) {int tmp *a;// 需要临时变量*a *b;*b tmp;
}int main() {int x, y, z;printf(请输入三个数字:\n);scanf(%d,%d,%d, x, y, z);// 注意输入的时候用逗号隔开// 两两比较前两个if可以保证 x 最小最后一个if可以保证 z 最大。if (x y)swap(x, y);if (x z)swap(x, z);if (y z)swap(y, z);printf(从小到大排序: %d %d %d\n, x, y, z);return 0;
}运行结果
请输入三个数字:
3,7,6
从小到大排序: 3 6 7006输出字母C图案
题目 用 * 号输出字母C的图案。
问题分析 按照字母C的形状直接输出即可。
/*** Created by 公众号数据结构和算法* Copyright © wansuanfa.com All rights reserved.*/#include stdio.hint main() {printf(用 * 号输出字母 C!\n);printf(****\n);printf(*\n);printf(* \n);printf(****\n);return 0;
}运行结果
用 * 号输出字母 C!
****
*
*
****007特殊图案
题目 输出特殊图案。
问题分析 不同字符图形不一样。需要把编码格式改成437 OEM-美国否则会出现乱码。
/*** Created by 公众号数据结构和算法* Copyright © wansuanfa.com All rights reserved.*/#includestdio.h
#include windows.h // 引用头文件int main() {SetConsoleOutputCP(437);// 设置编码为437 OEM-美国char a 177, b 223;// 随便两个数字printf(%c%c%c%c%c\n, b, a, a, a, b);printf(%c%c%c%c%c\n, a, b, a, b, a);printf(%c%c%c%c%c\n, a, a, b, a, a);printf(%c%c%c%c%c\n, a, b, a, b, a);printf(%c%c%c%c%c\n, b, a, a, a, b);return 0;
}运行结果 0089*9 乘法表
题目 输出 9*9 口诀。
问题分析 使用两个for循环即可完成。
/*** Created by 公众号数据结构和算法* Copyright © wansuanfa.com All rights reserved.*/#include stdio.hint main() {for (int i 1; i 10; i) {// 行for (int j 1; j i; j) { // 列// %-3d表示左对齐占3位printf(%d*%d%-3d, j, i, i * j); }printf(\n); // 换行}return 0;
}运行结果
1*11
1*22 2*24
1*33 2*36 3*39
1*44 2*48 3*412 4*416
1*55 2*510 3*515 4*520 5*525
1*66 2*612 3*618 4*624 5*630 6*636
1*77 2*714 3*721 4*728 5*735 6*742 7*749
1*88 2*816 3*824 4*832 5*840 6*848 7*856 8*864
1*99 2*918 3*927 4*936 5*945 6*954 7*963 8*972 9*981009国际象棋棋盘
题目 要求输出国际象棋棋盘。
问题分析 国际象棋棋盘由64个黑白相间的格子组成分为8行*8列。用 i 控制行 j 来控制列根据 ij 的和来控制输出黑方格还是白方格。
/*** Created by 公众号数据结构和算法* Copyright © wansuanfa.com All rights reserved.*/#includestdio.h
#include windows.h // 引用头文件int main() {SetConsoleOutputCP(437);// 设置编码为437 OEM-美国for (int i 0; i 8; i) {for (int j 0; j 8; j)if ((i j) % 2 0)printf(%c%c, 219, 219);// 白色elseprintf( );// 黑色printf(\n);// 换行}return 0;
}运行结果 010打印笑脸
题目 打印楼梯同时在楼梯上方打印两个笑脸。
问题分析 用 ASCII 1 输出笑脸用 i 和 j 来控制行和列然后输出白色当做楼梯要注意需要修改编码格式。
/*** Created by 公众号数据结构和算法* Copyright © wansuanfa.com All rights reserved.*/#includestdio.h
#include windows.h // 引用头文件int main() {SetConsoleOutputCP(437);// 设置编码为437 OEM-美国printf(\1\1\n); // 打印两个笑脸for (int i 1; i 10; i) {for (int j 1; j i; j)printf(%c%c, 219, 219);// 打印白色楼梯printf(\n);// 换行}return 0;
}运行结果 011兔子生崽
题目 古典问题兔子生崽有一对兔子从出生后第3个月起每个月都生一对兔子小兔子长到第三个月后每个月又生一对兔子假如兔子都不死问每个月的兔子总数为多少输出前40个月即可
问题分析 兔子的规律为1,1,2,3,5,8,13,21…即下个月是上两个月之和这是一个典型的斐波那契数列。
/*** Created by 公众号数据结构和算法* Copyright © wansuanfa.com All rights reserved.*/#includestdio.hint main() {int a 1, b 1;// 前两项printf(%12d%12d, a, b); // 输出前两项%12d表示占12行右对齐。for (int i 3; i 40; i) {// 从第3项开始计算int cur a b;// 当前月是上两个月之和a b;b cur;printf(%12d, cur);// 打印当前月的值if (i % 4 0)// 输入4个换行printf(\n);}return 0;
}运行结果 1 1 2 35 8 13 2134 55 89 144233 377 610 9871597 2584 4181 676510946 17711 28657 4636875025 121393 196418 317811514229 832040 1346269 21783093524578 5702887 9227465 1493035224157817 39088169 63245986 102334155012101到200的素数
题目 判断 101 到 200 之间的素数。
问题分析 101 到 200之间的偶数不可能是素数所以我们只需要判断奇数即可。对于每一个奇数判断能不能被 2 到 sqrt(包含这个数)之间的数整除如果能被整除则表明此数不是素数否则是素数。
/*** Created by 公众号数据结构和算法* Copyright © wansuanfa.com All rights reserved.*/#include stdio.h
#include stdbool.h
#include math.h// 判断101 到 200之间的奇数是否是素数。
bool isPrime(int num) {int sq (int) sqrt(num);// 计算平方根for (int j 2; j sq; j) {if (num % j 0)// 如果能被 j 整除则不是素数。return false;}return true;
}int main() {int count 0;// 统计素数的个数printf(素数在 101 到 200 之间的列表\n);// 101 到 200之间的偶数不可能是素数所以我们只需要判断奇数即可。for (int i 101; i 200; i 2) {if (isPrime(i)) { // 如果是素数则打印printf(%d , i);if (count % 5 0)// 每 5 个换行printf(\n);}}return 0;
}运行结果
素数在 101 到 200 之间的列表
101 103 107 109 113
127 131 137 139 149
151 157 163 167 173
179 181 191 193 197
199013水仙花数
题目 打印出所有的水仙花数所谓水仙花数是指一个三位数其各位数字立方和等于该数本身。例如153是一个水仙花数因为1531^35^33^3112527。
问题分析 对于100-999之间的每一个数分别求出个位十位百位然后计算它们的立方之和是否等于该数本身如果等于则是水仙花数否则不是。
/*** Created by 公众号数据结构和算法* Copyright © wansuanfa.com All rights reserved.*/#include stdio.hint main() {int i, x, y, z;for (i 100; i 1000; i) {x i % 10;// 个位y i / 10 % 10;// 十位z i / 100;// 百位if (i x * x * x y * y * y z * z * z)printf(%d\n, i);}return 0;
}运行结果
153
370
371
407014分解质因数
题目 将一个正整数分解质因数。例如输入 90,打印出 902*3*3*5。
问题分析 对于输入的整数n 判断 2 到 n 之间哪些数能被它整除如果能被正常则一直除。比如 120 能被 2 整除结果是 60 60 还能被 2 整除结果是 30 30 还能被 2 整除结果是 1515不能被 2 整除但 15 能被 3 正常结果是 5 5 不能被 3 整除但 5 能被 5 整除结果是 1 退出循环。
/*** Created by 公众号数据结构和算法* Copyright © wansuanfa.com All rights reserved.*/#includestdio.hint main() {int n;printf(请输入整数);scanf(%d, n);// 输入需要分解的整数printf(%d, n);// 遍历2到n之间的整数是否是n的质因数注意这里个n是变动的for (int i 2; i n; i) {while (n % i 0) {printf(%d, i);// 打印质因数n / i;// 改变n的值。if (n ! 1)printf(*);}}return 0;
}运行结果
请输入整数120
1202*2*2*3*5015(ab)?a:b
题目 利用条件运算符的嵌套来完成此题学习成绩90分的同学用A表示60-89分之间的用B表示60分以下的用C表示。
问题分析 在三目运算符中 c ? a : b 如果 c 为true则返回 a 否则返回 b 。这里我们可以使用三目运算符嵌套来完成此题。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#includestdio.hint main() {int s;// 学生成绩printf(请输入分数 );scanf(%d, s);// 输入成绩char g (char) (s 90 ? A : (s 60 ? B : C));printf(%c, g);return 0;
}运行结果
请输入分数96A016最大公约数和最小公倍数
题目 输入两个正整数 a 和 b 求其最大公约数和最小公倍数。
问题分析 最大公约数可以使用辗转相除法和更相减损术两种方式求这里我们使用辗转相除法来计算最大公约数。最小公倍数可以用输入的两个数之积除于它们的最大公约数求。比如计算 33 和 12 的最大公约数(33,12)→(129)→(93)因为 9 能被 3 整除所以33和12的最大公约数是 3 。
/*** Created by 公众号数据结构和算法* Copyright © wansuanfa.com All rights reserved.*/#includestdio.h// 辗转相除法求最大公约数
int gcd(int a, int b) {if (a b)// 要保证 a 比 b 大return gcd(b, a);if (a % b 0)// 如果 a 能被 b 整除直接返回 b 的值。return b;return gcd(b, a % b);// 递归
}int main() {int a, b;printf(请输入两个数字\n);scanf(%d %d, a, b);// 不能有 0 。int t gcd(a, b);// 计算最大公约数int y a * b / t;// 根据最大公约数计算最小公倍数printf(这两个数的最大公约数是%d最小公倍数是%d\n, t, y);return 0;
}运行结果
请输入两个数字
12 28
这两个数的最大公约数是4最小公倍数是84017统计字母、数字等
题目 输入一行字符分别统计出其中英文字母、空格、数字和其它字符的个数。
问题分析 对于输入字符进行统计直到遇到换行符为止。
/*** Created by 公众号数据结构和算法* Copyright ? wansuanfa.com All rights reserved.*/#includestdio.hint main() {char c;// 输入的字符int l 0, s 0, d 0, t 0;printf(请输入一些字符\n);while ((c getchar()) ! \n) {// 直到遇到换行符为止if ((c a c z) || (c A c Z)) {l;// 英文字母} else if (c 0 c 9) {d;// 数字} else if (c ) {s;// 空格} else {t;// 其他字符}}printf(字母%d, 数字%d, 空格 %d, 其他%d, l, d, s, t);return 0;
}运行结果
请输入一些字符
wansuanfa.com 666*()
字母 12, 数字 3, 空格 1, 其他 5018saaaaaa…
题目 求saaaaaaaaaaaa…a的值其中a是一个数字。例如222222222222222(此时共有5个数相加)几个数相加有键盘控制。
问题分析 输入的 n 是数字的个数把所有数字相加即可。
/*** Created by 公众号数据结构和算法* Copyright © wansuanfa.com All rights reserved.*/#includestdio.hint main() {int s 0, a, n, t;printf(请输入 a 和 n\n);scanf(%d %d, a, n);t a;while (n 0) {s t;a a * 10;t a;n--;}printf(aaa...%d\n, s);return 0;
}运行结果
请输入 a 和 n
2 5
aaa...24690019完数
题目 一个数如果恰好等于它的因子之和这个数就称为完数例如 6123 请编程找出 1000 以内的所有完数。
问题分析 计算1000以内每个数的因数判断因数之和是否等于该数如果等于则是完数否则不是。
/*** Created by 公众号数据结构和算法* Copyright © wansuanfa.com All rights reserved.*/#includestdio.hint main() {int k, a[256];for (int i 1; i 1000; i) {int sum 0;// 累加因子之和k 0;for (int j 1; j i / 2; j)if (i % j 0) {sum j;a[k] j;// 记录因子}if (i sum) {// 是否是完数printf(%d%d, i, a[0]);for (int j 1; j k; j)printf(%d, a[j]);// 打印因子printf(\n);// 换行}}return 0;
}运行结果
6123
28124714
4961248163162124248020小球自由下落
题目 一球从100米高度自由落下每次落地后反跳回原高度的一半再落下求它在第10次落地时共经过多少米第10次反弹多高
问题分析 反弹的高度是原来的一半路径是反弹高度的两倍因为反弹需要上和下两个方向。
/*** Created by 公众号数据结构和算法* Copyright © wansuanfa.com All rights reserved.*/#includestdio.hint main() {float h 100;// 初始高度float s 100;// 经过的长度for (int i 1; i 10; i) {h h / 2;// 每次反弹的高度是原来的一半s 2 * h;// 经过长度需要累加反弹高度的2倍}printf(第10次落地时共经过%f米第10次反弹高%f米\n, s, h);return 0;
}运行结果
第10次落地时共经过299.804688米第10次反弹高0.097656米021猴子吃桃问题
题目 猴子吃桃问题猴子第一天摘下若干个桃子当即吃了一半还不瘾又多吃了一个 第二天早上又将剩下的桃子吃掉一半又多吃了一个。以后每天早上都吃了前一天剩下 的一半零一个。到第10天早上想再吃时见只剩下一个桃子了。求第一天共摘了多少。
问题分析 采取逆向思维的方法从后往前推断。第 10 天 1 个桃子第 9 天是2*(11)4个桃子第 8天是2*(41)10个桃子以此类推如果当天吃了 x 个桃子那么前一天就是2*(x1)个桃子。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#include stdio.hint main() {int n 1;for (int i 1; i 10; i)n (n 1) * 2;printf(总数为%d, n);return 0;
}运行结果
总数为1534022乒乓球推理
题目 两个乒乓球队进行比赛各出三人。甲队为a,b,c三人乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比c说他不和x,z比请编程序找出三队赛手的名单。
问题分析 c 不和 xz 比所以 c 只能和 y 比a 不和 x 比所以 a 只能和 z 比那么 b 只能和 x 比直接能推算出来但这里要写出程序我们来看下。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#include stdio.hint main() {for (int a y; a z; a) {// a 不能和 x 比跳过 xfor (int b x; b z; b) {// bif (a b)// a与b不能和同一个人比较continue;for (int c y; c y; c) {// c不和x,z比if (a ! c b ! c)// c与ac不能和同一个人比较printf(笔试名单为a--%c\tb--%c\tc--%c\n,a, b, c);}}}return 0;
}运行结果
顺序为a--z b--x c--y023打印菱形
题目 打印出如下图案菱形。 *********
****************问题分析 先把菱形分成两部分来看待先打印前 4 行在打印后 3 行。每行只打印左边的空格右边的空格不需要打印。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#include stdio.hint main() {for (int i 0; i 3; i) {// 包括之间一行总共4行for (int j 0; j 2 - i; j)printf( );// 左边的空格for (int k 0; k 2 * i; k)printf(*);printf(\n);// 换行}for (int i 0; i 2; i) {// 下面打印3行for (int j 0; j i; j)printf( );// 左边的空格for (int k 0; k 4 - 2 * i; k)printf(*);printf(\n);}return 0;
}运行结果 *********
****************0242/13/25/3…
题目 有一分数序列2/13/25/38/513/821/13…求出这个数列的前20项之和。
问题分析 如果把分子和分母单独拿出来它们都是斐波那契数列可以参考 011兔子生崽直接累加分数即可。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#includestdio.hint main() {float sum 0;// 记录分数之和float t, a 2, b 1;// a 是分子b是分母for (int i 1; i 20; i) {sum a / b;// 累加分数// 更新 a b 的值t a b;b a;a t;}printf(%9.6f\n, sum);return 0;
}运行结果
32.660263025求阶乘的和
题目 求 1 2! 3! … 20! 的和。
问题分析 计算阶乘的值然后累加即可。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#includestdio.hint main() {long double sum 0, m 1;for (int i 1; i 20; i) {m * i;// 计算阶乘sum m;// 累加阶乘值}printf(%Lf\n, sum);return 0;
}运行结果
2561327494111820313.000000026递归求阶乘
题目 利用递归方法求5!。
问题分析 递归公式fun(n)fun(n-1)*n当 n 等于 1 的时候直接返回 1 即可。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#includestdio.hint fun(int n) {if (n 1)return 1;return fun(n - 1) * n;// 递归
}int main() {for (int i 1; i 5; i)printf(%d!%d\n, i, fun(i));return 0;
}运行结果
1!1
2!2
3!6
4!24
5!120027逆序打印字符
题目 利用递归函数调用方式将所输入的5个字符以相反顺序打印出来。
问题分析 当输入的字符个数不够 5 个的时候一直递归输入当输入 5 个字符的时候开始输出。递归类似于栈先压栈后出栈所以出栈的顺序和输入的顺序是相反的。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#include stdio.hvoid print(int n) {char ch getchar();// 输入字符if (n 1) {// n 等于 1 的时候开始输出printf(相反顺序输出结果:);} else {print(n - 1);// 递归}putchar(ch);// 输出字符。
}int main() {int i 5;printf(请输入%d个字符:, i);print(i);return 0;
}运行结果
请输入5个字符:qwert
相反顺序输出结果:trewq028岁数推理
题目 有5个人坐在一起问第五个人多少岁他说比第4个人大2岁。问第4个人岁数他说比第3个人大2岁。问第三个人又说比第2人大两岁。问第2个人说比第一个人大两岁。最后问第一个人他说是10岁。请问第五个人多大
问题分析 使用递归的方式第一个人是 10 岁第 n 个人的年龄是第 n-1 个人的年龄加 2 。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#include stdio.hint age(int n) {if (n 1)// 第一个人是 10 岁return 10;return age(n - 1) 2;// 递归
}int main() {printf(第五个人的岁数是%d\n, age(5));return 0;
}运行结果
第五个人的岁数是18029逆序打印各位数字
题目 给一个不多于5位的正整数要求一、求它是几位数二、逆序打印出各位数字。
问题分析 最多5位数可以获取数字的每一位如果万位不等于 0 肯定是 5 位数如果万位是 0 千位不等于 0 则是 4 位数……根据这样判断然后逆序输出。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#include stdio.hint main() {int x;printf(请输入 5 位数字);scanf(%d, x);int a x / 10000; // 万位数int b x % 10000 / 1000; // 千位数int c x % 1000 / 100; // 百位数int d x % 100 / 10; // 十位数int e x % 10; // 个位数if (a ! 0) {printf(是5位数,逆序为%d %d %d %d %d, e, d, c, b, a);} else if (b ! 0) {printf(是4位数,逆序为%d %d %d %d, e, d, c, b);} else if (c ! 0) {printf(是3位数,逆序为%d %d %d, e, d, c);} else if (d ! 0) {printf(是2位数,逆序为%d %d, e, d);} else if (e ! 0) {printf(是1位数,逆序为%d, e);}return 0;
}运行结果
请输入 5 位数字12345
是5位数,逆序为5 4 3 2 1030判断是否回文数
题目 一个5位数判断它是不是回文数。即12321是回文数个位与万位相同十位与千位相同。
问题分析 一个5位数只需要提取它的个位十位千万万位数字即可如果个位和万位数字相等并且十位和千位数字相等则是回文数否则不是。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#include stdio.hint main() {int x;printf(请输入 5 位数字);scanf(%d, x);int wan x / 10000; // 万位数int qian x % 10000 / 1000; // 千位数int shi x % 100 / 10; // 十位数int ge x % 10; // 个位数if (ge wan shi qian) {printf(这是回文数);} else {printf(这不是回文数);}return 0;
}运行结果
请输入 5 位数字12321
这是回文数031判断星期几
题目 请输入星期几的第一个字母来判断一下是星期几如果第一个字母一样则继续判断第二个字母。
问题分析 使用Switch语句如果第一个字母一样则输入第二个怎么继续判断。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#includestdio.hint main() {char i, j;printf(请输入第一个字母:);scanf(%c, i);// 输入字符getchar();// 获取换行符。switch (i) {case m:printf(monday);// 周一break;case w:printf(wednesday);// 周三break;case f:printf(friday);// 周五break;case t:printf(请输入下一个字母:);scanf(%c, j);if (j u) {// 周二printf(tuesday);break;}if (j h) {// 周四printf(thursday);break;}case s:printf(请输入下一个字母);scanf(%c, j);if (j a) {// 周六printf(saturday);break;}if (j u) {// 周日printf(sunday);break;}default :printf(error);break;}return 0;
}运行结果
请输入第一个字母:t
请输入下一个字母:u
tuesday032删字符串中的指定字母
题目 删除一个字符串中的指定字母如字符串 “aca”删除其中的 a 字母。
问题分析 逐个判断原字符串中的字符是否是需要删除的如果不是删除的则保留。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#include stdio.h
#include string.h// 删除字符串中指定字母
char *deleteCharacters(char *str, char *del) {// 如果要删除的字符集为空则直接返回原字符串if (del NULL)return str;// 用于存储要删除的字符的哈希表int hash[256] {0};// 标记哪些字符需要删除for (int i 0; i strlen(del); i)hash[del[i]] 1;int curIndex 0;// 通过遍历字符串来删除指定的字符for (int i 0; i strlen(str); i) {// 如果当前字符不在要删除的字符集中则保留该字符if (!hash[str[i]])str[curIndex] str[i];}str[curIndex] \0; // 字符串结束的标志return str;
}int main() {char s1[] acasftd; // 原字符串char s2[] as; // 要删除的字母// 打印删除指定字符后的字符串printf(删除之后的字符串是%s, deleteCharacters(s1, s2));return 0;
}运行结果
删除之后的字符串是cftd033判断是否质数
题目 判断一个数字是否为质数。
问题分析 质数prime number又称素数。一个大于1的自然数除了 1 和它本身外不能被其他自然数整除。如果一个数不是素数则肯定有一个因数 x且 2xsqrt(x) 。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#includestdio.h
#include stdbool.h
#includemath.hbool isPrime(int n) {// 判断 n 是否是素数if (n 2)// 最小的素数是 2 。return false;int sq (int) sqrt(n);// 先计算n的平方根for (int i 2; i sq; i) {if (n % i 0)return false;// 不是素数}return true;// 是素数
}int main() {int n 0;printf(请输入一个自然数:);scanf(%d, n);int ans isPrime(n);if (ans) {printf(是素数);} elseprintf(不是素数);return 0;
}运行结果
请输入一个自然数:18
不是素数034练习函数调用
题目 练习函数调用。
问题分析 略
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#include stdio.hvoid say(void) {printf(公众号数据结构和算法\n);printf(一个专门讲算法的公众号\n);
}void three_say(void) {for (int counter 1; counter 3; counter)say();// 调用上面函数3次
}int main() {three_say();// 函数调用return 0;
}运行结果
公众号数据结构和算法
一个专门讲算法的公众号
公众号数据结构和算法
一个专门讲算法的公众号
公众号数据结构和算法
一个专门讲算法的公众号035字符串反转
题目 字符串反转如将字符串 “www.wansuanfa.com” 反转为 “moc.afnausnaw.www”。
问题分析 使用两个指针left和right刚开始的时候分别指向字符串的两端然后交换这两个指针指向的字符交换完之后两个指针分别往中间移继续交换直到两个指针相遇或者leftright为止。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#include stdio.h
#include string.hvoid reverse(char *s) {// 反转字符串// 获取字符串长度int len strlen(s);// 使用双指针int left 0, right len - 1;while (left right) {// 交换两个指针指向的字符char ch *(s left);*(s left) *(s right);*(s right) ch;// 两个指针往中间移left;right--;}
}int main() {char s[] www.wansuanfa.com;printf(原字符串是%s\n, s);reverse(s); // 反转字符串printf(反转之后的字符串是%s\n, s);return 0;
}运行结果
原字符串是www.wansuanfa.com
反转之后的字符串是moc.afnausnaw.www036100内的素数
题目 求100之内的素数。
问题分析 计算素数的方式比较多可以直接筛选也可以使用埃氏筛选法还可以使用欧拉筛详细内容可以关注公众号数据结构和算法进行获取。我们这里使用埃氏筛选法的方式来计算100以内的素数对于一个素数它的倍数(大于等于2)肯定不是素数我们把素数的倍数都标记一下代码如下。
/*** Created by 公众号数据结构和算法* Copyright © wansuanfa.com All rights reserved.*/
#includestdio.h
#include stdbool.h
#include memory.hint main() {// 埃氏筛选法求素数const int N 100;int prime[N 1];// 记录素数int count 0;// 素数的个数bool vis[N 1];// 记录数字false表示素数true表示不是素数。memset(vis, 0, sizeof vis);// 默认都是素数for (int i 2; i N; i) {if (!vis[i]) {// 如果是素数prime[count] i;// 记录素数// 素数的倍数不是素数。for (int j 2 * i; j N; j i)vis[j] true;}}// 打印100以内的素数for (int i 0; i count; i) {printf(%d , prime[i]);if ((i 1) % 5 0)// 5个一换行printf(\n);}return 0;
}运行结果
2 3 5 7 11
13 17 19 23 29
31 37 41 43 47
53 59 61 67 71
73 79 83 89 97 037排序
题目 对10个数进行排序。
**问题分析**关于排序算法比较多我之前写过《20多种排序算法》我们可以从中随便选择一个这里我们使用冒泡排序来解。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#includestdio.h#define N 10// 交换数组中两个元素的值。
void swap(int arr[], int i, int j) {int tmp arr[i];arr[i] arr[j];arr[j] tmp;
}// 冒泡排序。
void sort(int arr[], int n) {for (int i 1; i n; i) {// 只需要比较 n-1 轮即可。for (int j 0; j n - i; j) {// 如果当前元素大于它的下一个元素则交换他俩的值。if (arr[j] arr[j 1])swap(arr, j, j 1);}}
}int main() {int arr[N];printf(请输入 %d 个数字\n, N);for (int i 0; i N; i)scanf(%d, arr[i]);// 输入10个数字sort(arr, N);// 排序printf(排序结果是:\n);for (int i 0; i N; i)printf(%d , arr[i]);// 打印排序结果return 0;
}运行结果
请输入 10 个数字
2 3 6 7 8 56 34 8 12 13
排序结果是:
2 3 6 7 8 8 12 13 34 56038矩阵对角元素和
题目 求一个3*3矩阵对角线元素之和
问题分析 输入二维矩阵累加a[i][i]即可。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#includestdio.h#define N 3int main() {int a[N][N], sum 0;printf(请输入矩阵(3*3)\n);for (int i 0; i N; i)for (int j 0; j N; j)scanf(%d, a[i][j]);for (int i 0; i N; i)sum a[i][i];printf(对角线之和为%d\n, sum);return 0;
}运行结果
请输入矩阵(3*3)
1 2 3
4 5 6
7 8 9
对角线之和为15039一个数插入数组
题目 有一个已经排好序的数组。现输入一个数 x 要求按原来的规律将它插入数组中。
问题分析 从后往前把大于 x 的值全部往后挪找到插入的位置之后再把数字插入对应的位置。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#includestdio.hint main() {int a[11] {3, 4, 6, 9, 26, 37, 42, 58, 60, 82};int num;// 需要插入的数字printf(原始数组是:\n);for (int i 0; i 10; i)// 打印原始数组printf(%-4d, a[i]);printf(\n插入一个新的数字: );scanf(%d, num);// 输入要插入的数字int i 9;while (i 0) {// 查找插入位置if (a[i] num) {a[i 1] a[i];// 往后挪} else {break;// 找到插入的位置停止查找}i--;}a[i 1] num;// 插入需要插入的位置for (i 0; i 11; i)// 打印插入之后的数组printf(%-4d, a[i]);return 0;
}运行结果
原始数组是:
3 4 6 9 26 37 42 58 60 82
插入一个新的数字:163 4 6 9 16 26 37 42 58 60 82040数组逆序输出
题目 将一个数组逆序输出。
问题分析 从后往前输出即可。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#includestdio.h#define N 10int main() {int a[N] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};printf(原始数组是:\n);for (int i 0; i N; i)printf(%d , a[i]);printf(\n逆序之后的数组:\n);for (int i N - 1; i 0; i--)printf(%d , a[i]);return 0;
}运行结果
原始数组是:
0 1 2 3 4 5 6 7 8 9
逆序之后的数组:
9 8 7 6 5 4 3 2 1 0041static用法1
题目 学习 static 定义静态变量的用法。
在 C 语言中static 关键字用于声明静态变量和静态函数。静态变量在声明时被初始化只被初始化一次而且在整个程序的生命周期内都保持存在。在函数内声明的静态变量只能在该函数内访问而在函数外声明的静态变量则只能在该文件内访问。而静态函数可以参考 043static用法2。
问题分析 以下函数中 fun() 声明了一个静态变量 x并将其初始化为 0。每次调用 fun() 函数时x 的值都会加 1并打印出新的值。由于 x 是静态变量它在程序的整个生命周期中都存在。因此每次调用 fun() 时它都可以记住 x 的值并在此基础上递增。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#includestdio.hvoid fun() {static int x 0;// 定义静态变量x;// 加 1 。printf(%d\n, x);
}int main() {fun(); // 输出 1fun(); // 输出 2fun(); // 输出 3return 0;
}运行结果
1
2
3042auto用法
题目 学习使用auto定义变量的用法。
问题分析 在C语言中auto 关键字用于声明变量时指定变量的存储类别。auto 关键字告诉编译器该变量的生命周期仅限于定义它的代码块通常是函数之内即该变量是自动存储的。这意味着变量的存储是在栈上分配的而不是在静态存储区域如全局变量或静态局部变量。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#include stdio.hvoid fun() {auto int x 10; // x 是自动存储的局部变量x;printf(x 变量为 %d \n, x);
}int main() {fun();fun();fun();return 0;
}运行结果
x 变量为 11
x 变量为 11
x 变量为 11043static用法2
题目 学习使用static的另一用法。
问题分析 static声明的函数和变量只能在该文件中使用这和面向对象语言中的private关键字声明的函数和变量类似。比如在file1.c文件中定义了一个static函数在file2.c文件中调用这个函数就会出现错误。如果把file1.c文件中的static关键字去掉在file2.c文件中就可以调用这个函数了。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/// file1.c
#include stdio.hstatic void printStatic() {printf(static void);
}// file2.c
#includestdio.hextern void printStatic();// 不能调用int main() {printStatic();return 0;
}044extern的使用
题目 学习使用如何调用外部函数。
问题分析 比如在file1.c文件中定义了一个变量name和一个函数printVal但在file2.c文件中调用这个变量和函数需要添加extern关键字。如果不要extern关键字可以参考 050#include练习 。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/// file1.c
#includestdio.hint name 10;void printVal(int val) {printf(printVal is%d, val);
}// file2.c
#includestdio.hextern int name;// 引用外部变量extern void printVal(int val);// 引用外部函数int main() {printVal(name 10);return 0;
}运行结果
printVal is20045register用法
题目 学习使用register定义变量的方法。
问题分析 在 C 语言中register 关键字用于向编译器建议将某个变量存储在寄存器中以提高对该变量的访问速度。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#includestdio.hint main() {int sum 0;for (register int i 1; i 100; i)sum i;printf(1到100所有数字的和为%d, sum);return 0;
}运行结果
1到100所有数字的和为5050046宏#define练习1
题目 宏#define命令练习。
问题分析 宏的功能比较强大主要有1定义常量2. 创建类型别名3. 定义简单的函数替代4. 定义复杂的代码片段5. 条件编译6. 宏参数的字符串化7. 宏参数的连接。
我们先来看前两个定义常量和创建类型别名。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#includestdio.h#define PI 3.14159 // 定义PI的值为3.14159
#define INT32 int // 定义INT32表示int类型int main() {// 下面定义了两个int类型的变量INT32 a 1314;INT32 r 520;// 计算圆的面积double s PI * r * r;printf(变量 a 的值是%d \n, a);printf(圆的半径 r 是%d \n, r);printf(圆的面积 s 是%lf \n, s);return 0;
}运行结果
变量 a 的值是1314
圆的半径 r 是520
圆的面积 s 是849485.936000047宏#define练习2
题目 宏#define命令练习2。
问题分析 下面再来看下使用宏定义简单的函数替代和定义复杂的代码片段。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#includestdio.h#define SQUARE(x) ((x) * (x))
#define exchange(a, b) { int t;ta;ab;bt;}// 放在一行里int main() {int a 10;int b 20;int sq SQUARE(a);printf(交换之前 a%d; b%d\n, a, b);printf(交换之前 a 的平方是%d\n, sq);exchange(a, b);printf(交换之后 a%d; b%d\n, a, b);return 0;
}运行结果
交换之前 a10; b20
交换之前 a 的平方是100
交换之后 a20; b10048宏#define练习3
题目 宏#define命令练习3。
问题分析 除此之外宏还有其他一些定义和操作。比如 #define 可以使用 # 操作符将宏参数转换为字符串#define 可以使用 ## 操作符将两个宏参数连接成一个标识符。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#includestdio.h#define STR(x) #x // 将参数x转换为字符串
#define CONCAT(x, y) x##y // 将两个宏参数连接成一个标识符int main() {int CONCAT(my, age) 18;printf(将参数a转换为字符串%s\n, STR(name));printf(将两个宏参数连接成一个标识符%d, myage);return 0;
}运行结果
将参数a转换为字符串name
将两个宏参数连接成一个标识符18049#if,#ifdef,#ifndef
题目 #if #ifdef和#ifndef的综合应用。
问题分析 常见的条件编译指令
#ifdef如果宏已定义则编译以下代码。#ifndef如果宏未定义则编译以下代码。#if根据条件表达式的值编译代码。#else如果前面的条件不满足则编译以下代码。#elif在 #if 或 #else 后提供另一个条件。#endif结束条件编译块。
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#includestdio.h#define NAME // 定义名字nameint main() {#ifdef NAMEprintf(NAME 被定义了。。。\n);
#elseprintf(NAME 没有被定义。。。\n);
#endif#ifndef AGEprintf(AGE 没有被定义。。。\n);
#elseprintf(AGE 被定义了。。。\n);
#endif#undef NAME
#ifdef NAMEprintf(NAME 取消定义失败。。。\n);
#elseprintf(NAME 取消定义成功。。。\n);
#endif#define AGE
#ifndef AGEprintf(AGE 定义失败。。。\n);
#elseprintf(AGE 定义成功。。。\n);
#endifreturn 0;
}运行结果
NAME 被定义了。。。
AGE 没有被定义。。。
NAME 取消定义成功。。。
AGE 定义成功。。。050#include练习
题目 #include 的应用练习。
问题分析 在C语言中#include 预处理指令用于包含头文件这是C语言程序中非常常见的操作。头文件通常包含函数声明、宏定义、类型定义、模板声明等它们可以被多个源文件共享。
#include 指令通常有两种格式
1尖括号 用于标准库头文件。编译器会在预定义的目录中搜索这些头文件。
2双引号 用于用户自定义的头文件或第三方库头文件。编译器首先在包含当前文件的同一目录中搜索如果找不到再在标准库目录中搜索。
假如我们创建两个文件一个是头文件 test.h 还一个是主文件头文件test.h中的代码如下可以看到和 044extern的使用 的区别就是这里不需要再使用extern关键字导入了。
// 在头文件中定义的常量
#define NAME 公众号数据结构和算法主文件中的代码如下
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#includestdio.h
#include test.h// 引用头文件int main() {// 打印头文件中定义的常量printf(%s\n, NAME);return 0;
}运行结果
公众号数据结构和算法051按位与
题目 学习使用按位与 。
问题分析 按位与有 4 种情况只要有一个是 0 结果就是 0 。
0 00;0 10;1 00;1 11;
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#includestdio.hvoid printBinary(int num) {// 打印二进制for (int i 31; i 0; i--) {int bit (num i) 1;printf(%d, bit);if (i % 8 0)// 每8个加一个空格printf( );}printf(\n);
}int main() {int a 23, b 13;printf(整数 a 的值是%d二进制表示如下\n, a);printBinary(a);printf(整数 b 的值是%d二进制表示如下\n, b);printBinary(b);int and a b;printf(a 和 b 按位 的值是%d二进制表示如下\n, and);printBinary(and);return 0;
}运行结果
整数 a 的值是23二进制表示如下
00000000 00000000 00000000 00010111
整数 b 的值是13二进制表示如下
00000000 00000000 00000000 00001101
a 和 b 按位 的值是5二进制表示如下
00000000 00000000 00000000 00000101052按位或 |
题目 学习使用按位或 |。
问题分析 按位或有 4 种情况只要有一个是 1 结果就是 1 。
0 | 00;0 | 11;1 | 01;1 | 11;
/*** Created by 公众号数据结构和算法* Copyright wansuanfa.com All rights reserved.*/#includestdio.hvoid printBinary(int num) {// 打印二进制for (int i 31; i 0; i--) {int bit (num i) 1;printf(%d, bit);if (i % 8 0)// 每8个加一个空格printf( );}printf(\n);
}int main() {int a 18, b 13;printf(整数 a 的值是%d二进制表示如下\n, a);printBinary(a);printf(整数 b 的值是%d二进制表示如下\n, b);printBinary(b);int or a | b;printf(a 和 b 按位 | 的值是%d二进制表示如下\n, or);printBinary(or);return 0;
}运行结果
整数 a 的值是18二进制表示如下
00000000 00000000 00000000 00010010
整数 b 的值是13二进制表示如下
00000000 00000000 00000000 00001101
a 和 b 按位 | 的值是31二进制表示如下
00000000 00000000 00000000 00011111剩余部分可以在百度网盘下载 链接: https://pan.baidu.com/s/1FXhdXvC7VkwWA9fQtOpHFA?pwd6666 提取码: 6666