C语言常用算法回顾

C语言三个数从小到大排序/输出
任意输入 3 个整数,编程实现对这 3 个整数由小到大进行排序。
实现过程:
(1)定义数据类型,本实例中 a、b、c、t 均为基本整型。
(2) 使用输入函数获得任意 3 个值赋给 a、b、c。
(3) 使用 if 语句进行条件判断,如果 a 大于 b,则借助于中间变量 t 互换 a 与 b 值, 依此类推比较 a 与 c、b 与 c,最终结果即为 a、b、c 的升序排列。
(4) 使用输出函数将 a、b、c 的值依次输出。
(5) 程序的代码如下:
1.#include <stdio.h>
2.int main()
3.{
4. int a,b,c,t; /定义4个基本整型变量a、b、c、t/
5. printf(“Please input a,b,c:\n”); /双引号内的普通字符原样输出并换行/
6. scanf("%d,%d,%d",&a,&b,&c); /输入任意3个数/
7. if(a>b) /如果a大于b,借助中间变量t实现a与b值的互换/
8. {
9. t = a;
10. a = b;
11. b = t;
12. }
13. if(a>c) /如果a大于c,借助中间变景t实现a与c值的互换/
14. {
15. t = a;
16. a = c;
17. c = t;
18. }
19. if(b>c) /如果b大于c,借助中间变量t实现b与c值的互换/
20. {
21. t = b;
22. b = c;
23. c = t;
24. }
25. printf(“The order of the number is:\n”);
26. printf("%d,%d,%d",a,b,c); /输出函数顺序输出a、b、c的值/
27. return 0;
28.}
运行结果:
Please input a,b,c:
5,3,9
The order of the number is:
3,5,9
脚下留神:
本实例使用 scanf("%d%d%d",&a,&b,&c); 从键盘中获得任意 3 个数。在输入数据时,在两个数据之间以一个或多个空格间隔,也可以用 Enter 健、Tab 键,不能用逗号作为两个数据间的分隔符。 如果用格式输入函数 scanf("%d,%d,%d",&a,&b,&c) 输入数据,两个数据之间要用“,”做间隔。
类比冒泡排序,自前向后,逐步消除逆序。
C语言猴子吃桃问题
猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将第一天剩下的桃子吃掉一半,有多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第 10 天早上想再吃时,发现只剩下一个桃子了。编写程序求猴子第一天摘了多少个桃子。
实现过程:
(1) 定义 day、x1、x2 为基本整型,并为 day 和 x2 赋初值 9 和 1。

(2) 使用 while 语句由后向前推出第一天摘的桃子数。

(3) 输出结果。

(4) 程序代码如下:
1.#include <stdio.h>
2.int main()
3.{
4. intday,x1,x2; /定义 day、x1、x2 3 个变董为基本整型/
5. day=9;
6. x2=1;
7. while(day>0)
8. {
9. x1=(x2+1)2; /第一天的桃子数是第二天桃子数加1后的2倍/
10. x2=x1;
11. day–; /因为从后向前推所以天数递减/
12.
13. }
14. printf(“the total is %d\n”,x1); /
输出桃子的总数*/
15. return 0;
16.}
运行结果:
the total is 1534
技术要点:
本实例的思路基本上是先找出变量间的关系,也就是要明确第一天桃数和第二天桃子数之间的关系,即第二天桃子数加 1 的 2 倍等于第一天的桃子数。
C语言百钱买百鸡(百钱百鸡,百鸡问题)
中国古代数学家张丘建在他的《算经》中提出了一个著名的“百钱买百鸡问题”,鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?
实现过程:
(1)使用 for 语句对 3 种鸡的数嫌在事先确定好的范围内进行穷举并判断,对满足条件的 3 种鸡的数量按指定格式输出,否则进行下次循环。
(2)三个版本
#include<stdio.h>
void main()
{
int i, j, k,m=0;
for (i = 0; i <= 20; i++)
for (j = 0; j <33 ; j++)
for (k = 0; k < 100; k++)
{
if (5 * i + 3 * j + k / 3 == 100&&i+j+k100) {
printf("%d %d %d\n", i, j, k); m++;
}
}
printf("%d", m);
}
void main()
{
int i, j, k,m=0;
for (i = 0; i <= 20; i++)
for (j = 0; j <33 ; j++)
for (k = 0; k < 100; k++)
{
if (5 * i + 3 * j + k / 3 == 100&&i+j+k
100&&k%3==0) {
printf("%d %d %d\n", i, j, k); m++;
}
}
printf("%d", m);
}

(2) 程序代码如下:
1.#include <stdio.h>
2.int main()
3.{
4. int cock,hen,chick; /定义变童为基本整型/
5.
6. for(cock=0;cock<=20;cock++) /公鸡范围在 0~20 之间/
7.
8. for(hen=0;hen<=33;hen++) /母鸡范围在 0~33 之间/
9.
10. for(chick=3;chick<=99;chick++) /小鸡范围在 3~99 之间/
11.
12. if(5cock+3hen+chick/3100) /判断钱数是否等于 100/
13.
14. if(cock+hen+chick
100) /判断购买的鸡数是否等于 100/
15.
16. if(chick%3==0) /判断小鸡数是否能被 3 整除/
17.
18. printf(“公鸡:%d,母鸡:%d,小鸡:%d\n”,cock,hen,chick);
19.
20. return 0;
21.}
运行结果:
公鸡:0,母鸡:25,小鸡:75
公鸡:4,母鸡:18,小鸡:78
公鸡:8,母鸡:11,小鸡:81
公鸡:12,母鸡:4,小鸡:84
技术要点:
根据题意设公鸡、母鸡和雏鸡分别为 cock、hen 和 chick,如果 100 元全买公鸡,那么最多能买 20 只,所以 cock 的范围是大于等于 0 且小于等于 20;如果全买母鸡,那么最多能买 33 只,所以 hen 的范围是大于等于 0 且小于等于 33;如果 100 元钱全买小鸡,那么最多能买 99 只(根据题意小鸡的数量应小于 100 且是 3 的倍数)。

在确定了各种鸡的范围后进行穷举并判断,判断的条件有以下 3 点:
(1) 所买的 3 种鸡的钱数总和为 100。
(2) 所买的 3 种鸡的数量之和为 100。
(3) 所买的小鸡数必须是 3 的倍数。
 首页 > C语言编程实例阅读:5,846
C语言渔夫打鱼晒网问题
如果一个渔夫从 2011 年 1 月 1 日开始每三天打一次渔,两天晒一次网,编程实现当输入 2011 1 月 1 日以后的任意一天,输出该渔夫是在打渔还是在晒网。
实现过程:
(1)自定义函数 leap(),用来判断输入的年份是否是闰年。
普通闰年:能被4整除但不能被100整除的年份为普通闰年。(如2004年就是闰年,1999年不是闰年);
世纪闰年:能被400整除的为世纪闰年。(如2000年是世纪闰年,1900年不是世纪闰年);

(2) 自定义函数 number(),用来计算输入日期距 2011 年 1 月 1 日共有多少天。

(3) main() 函数作为程序的入口函数,在 main() 函数中调用上面两个函数。程序代码如下:
1.#include <stdio.h>
2.int leap(int a) /自定义函数leap()用来指定输入的年份是否为闰年/
3.{
4. if (a%40&&a%100!=0||a%4000) /* 闰年判定条件 */
5. return 1; /是闰年返回1/
6. else
7. return 0; /不是闰年返回O/
8.}
9.
10.int number(int year,int month,int day) /自定义函数 number() 计算输入日期距2011年1月1日共有多少天/
11.{
12. int sum = 0, i, j, k;
13. int a[12]={31,28,31,30,31,30,31,31,30,31,30,31}; /数组a存放平年每月的天数/
14. int b[12]={31,29,31,30,31,30,31,31,30,31,30,31}; /数组b存放闰年每月的天数/
15.
16. if(leap(year)==1) /判断是否为闰年/
17. for(i=0;i<month-1;i++)
18. sum+=b[i]; /是闰年,累加数组b前m-1个月份的天数/
19. else
20. for(i=0;i<month-1;i++)
21. sum+=a[i]; /不是闰年,累加数组a前m-1个月份的天数/
22. for(j=2011;j<year;j++)
23. if (leap(j)==i)
24. sum+=366; /2011年到输入的年份是闰年的加366/
25. else
26. sum+=365; /2011年到输入的年份不是闰年的加365/
27. sum+=day; /将前面累加的结果加上日期,求出总天数/
28. return sum; /返回计算的天数/
29.}
30.
31.int main()
32.{
33. int year,month,day,n;
34. printf(“请输入年月日\n”);
35. scanf("%d%d%d",&year,&month,&day); /输入年月日/
36. n=number(year,month,day); /调用函数 number()/
37. if((n%5)<4&&(n%5)>0) /余数是1或2或3时说明在打渔,否则在晒网/
38. printf("%d:%d:%d 打鱼\n",year,month,day);
39. else
40. printf("%d:%d:%d 晒网\n",year,month,day);
41. return 0;
42.}
运行结果:
请输入年月日
2011 1 4
2011:1:4 晒网
技术要点:
本实例主要有以下两个技术要点:

(1) 判断输入的年份(2011 年以后包括 2011 年)是否为闰年,这里自定义函数 leap() 来进行判断。该函数的核心内容就是闰年的判断条件即能被 4 整除但不能被 100 整除,或能被 400 整除。

(2) 求输入日期距 2011 年 1 月 1 日有多少天。首先判断 2011 年距输入的年份有多少年,这其中有多少年是闰年就将 sum 加多少个 366,有多少年是平年便将 sum 加上多少个 365。

其次要将 12 个月每月的天数存到数组中,因为闰年 2 月份的天数有别于平年,故采用两个数组 a 和 b 分别存储。若输入年份是平年,月份为 m 时就在前面累加日期的基础上继续累加存储着平年每月天数的数组的前 m-1 个元素,将累加结果加上输入的日期便求出了最终结果。闰年的算法类似。
C语言希尔排序算法
用希尔排序法对一组数据由小到大进行排序,数据分别为 69、56、12、136、3、55、46、 99、88、25。
实现过程:
(1)自定义函数 shsort(),实现希尔排序。

(2) main() 函数作为程序的入口函数。程序代码如下:
1.#include <stdio.h>
2.int shsort(int s[], int n) /* 自定义函数 shsort()/
3.{
4. int i,j,d;
5. d=n/2; /确定固定增虽值/
6. while(d>=1)
7. {
8. for(i=d+1;i<=n;i++) /数组下标从d+1开始进行直接插入排序/
9. {
10. s[0]=s[i]; /设置监视哨/
11. j=i-d; /确定要进行比较的元素的最右边位置/
12. while((j>0)&&(s[0]<s[j]))
13. {
14. s[j+d]=s[j]; /数据右移/
15. j=j-d; /向左移d个位置V/
16. }
17. s[j + d]=s[0]; /在确定的位罝插入s[i]/
18. }
19. d = d/2; /增里变为原来的一半/
20. }
21.return 0;
22.}
23.
24.int main()
25.{
26. int a[11],i; /定义数组及变量为基本整型/
27. printf(“请输入 10 个数据:\n”);
28. for(i=1;i<=10;i++)
29. scanf("%d",&a[i]); /从键盘中输入10个数据/
30. shsort(a, 10); /
调用 shsort()函数*/
31. printf(“排序后的顺序是:\n”);
32. for(i=1;i<=10;i++)
33. printf("%5d",a[i]); /输出排序后的数组/
34. printf("\n");
35. return 0;
36.}
运行结果:
请输入 10 个数据:
69 56 12 136 3 55 46 99 88 25
排序后的顺序是:
    3   12   25   46   55   56   69   88   99  136
技术要点:
希尔排序是在直接插入排序的基础上做的改进,也就是将寒排序的序列按固定增量分成若干组,等距者在同二组中,然后再在组内进行直接插入排序。这里面的固定增量从 n/2 开始,以后每次缩小到原来的一半。
搜索算法 和 排序算法
推荐算法 =>机器学习 计算机建模分析运算 虚拟化 更优化的算法
扫雷算法 迷宫算法 自动计算 bluepath 图论算法 深度学习deepmind 计算机视觉 特征提取 demo 抠图算法 压缩算法 数据库
> 算法库 database 性能优化 快速运算 instant 创造更有意义的东西 积累 逐步前进 C++ ins

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值