博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言复习笔记-17种小算法-解决实际问题
阅读量:5145 次
发布时间:2019-06-13

本文共 15664 字,大约阅读时间需要 52 分钟。

判断日期为一年中的第几天(考虑闰年)

复制代码

1 /* 2 * 计算该日在本年中是第几天,注意闰年问题 3 * 以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天 4 * 特殊情况,闰年且输入月份大于3时需考虑多加一天 5 */ 6  7 /* 8 *@author: 成鹏致远  9 *@net: http://infodown.tap.cn10 */11 12 #include 
13 #include
14 15 struct year_mon_day16 {17 int year;18 int mon;19 int day;20 };21 22 int main()23 {24 int i;25 int sum;//总天数26 bool flag = false;//闰年标志27 struct year_mon_day ymd;28 29 printf("Pls input year,mon day:");30 scanf("%d%d%d",&ymd.year,&ymd.mon,&ymd.day);31 32 switch(ymd.mon)33 {34 case 1:35 sum = 0;36 break;37 case 2:38 sum = 31;39 break;40 case 3:41 sum = 59;42 break;43 case 4:44 sum = 90;45 break;46 case 5:47 sum = 120;48 break;49 case 6:50 sum = 151;51 break;52 case 7:53 sum = 181;54 break;55 case 8:56 sum = 212;57 break;58 case 9:59 sum = 243;60 break;61 case 10:62 sum = 173;63 break;64 case 11:65 sum = 304;66 break;67 case 12:68 sum = 334;69 break;70 default:71 printf("data error \n");72 return 1;73 }74 sum += ymd.day;75 76 if(ymd.year/100 || (ymd.year%4 && ymd.year%100 != 0))77 {78 flag = true;79 }80 81 if(1==flag && ymd.mon>2)82 {83 sum++;84 }85 86 printf("%d年%d月%d日 是%d年的第%d天 \n",ymd.year,ymd.mon,ymd.day,ymd.year,sum);87 88 return 0;89 }

复制代码

十进制转十六进制

复制代码

1 /*函数实现输入一个十进制数,输出对应的十六进制数*/ 2 /* 3 *@author: 成鹏致远  4 *@net: http://infodown.tap.cn 5 */ 6  7 #include 
8 #include
9 #define LIM 3210 11 int main(void)12 {13 int decimal;14 bool negative = false;15 printf("pls input the integer to convert:\n");16 17 if(!scanf("%d", &decimal))18 {19 printf("we need an integer, Bye-bye!\n");20 return -1;21 }22 if(decimal < 0)23 {24 negative = true; 25 decimal *= -1;26 }27 28 int i, num[LIM];29 for(i=0; i
0; j--){42 switch(num[j-1]){43 case 10:44 printf("a");45 break;46 case 11:47 printf("b");48 break;49 case 12:50 printf("c");51 break;52 case 13:53 printf("d");54 break;55 case 14:56 printf("e");57 break;58 case 15:59 printf("f");60 break;61 default:62 printf("%d", num[j-1]);63 break;64 } //switch65 } //for66 printf("\n");67 68 return 0;69 }

复制代码

打印指定的字母金字塔(技巧)

复制代码

1 /* 2 *    产生一个字母金字塔图案 3 *    author:成鹏致远 4 *    net:infodown.tap.cn 5 */ 6  7 #include 
8 9 void PintLetterPic(char); //打印出金字搭字母图案10 11 int main()12 {13 char letter;14 15 printf("Please input a capital letter:");16 scanf("%c",&letter);17 18 PintLetterPic(letter);19 20 return 0;21 }22 23 void PintLetterPic(char c) //打印出金字搭字母图案24 {25 int len = c - 'A'+1; //注意这里需要+1!!!26 int len2 = 2*len;27 char tem[100][200];28 int i,j;29 char tempchar = 'A';30 31 for(i=0; i<100; i++) //初始化二维数组32 {33 for(j=0; j<200; j++)34 {35 tem[i][j] = ' ';36 }37 }38 /*******************************核心算法*********************************************/ 39 40 for(i=0; tempchar<=c; i++,tempchar++)//从最中间列从上往下控制行41 {42 int m = 1;43 char temp = tempchar; //需要保存tempchar的一个临时变量,保证tempchar在while循环中不被改变44 tem[i][len] = tempchar; //控制最中间的一列45 46 47 while('A' != temp) //从行最中间左右控制列48 {49 tem[i][len-m]=tem[i][len+m]=--temp;50 m++;51 }52 }53 54 /*******************************核心算法*********************************************/ 55 56 57 for(i=0; i

复制代码

求float型数的幂

复制代码

1 /*用循环的方法实现,返回一个float 类型数的某个整数次幂,保留六位小数*/ 2 /* 3 *@author: 成鹏致远  4 *@net: http://infodown.tap.cn 5 */ 6  7 #include 
8 #include
9 10 float my_power(float cardinal, int pow); //返回cardinal的pow次幂11 12 int main()13 {14 float cardinal; //底数15 int pow; //幂16 17 printf("Please input a float cardinal and a int pow(3.14,-2):");18 scanf("%f,%d",&cardinal,&pow);19 20 printf("%f的%d次幂是:%.6f \n",cardinal,pow,my_power(cardinal,pow));21 22 return 0;23 }24 25 float my_power(float cardinal, int pow)26 {27 float result = 1.0;28 int abs_pow = abs(pow);29 30 if(0 != abs_pow) //非0次幂31 {32 while(abs_pow--)33 {34 result *= pow>0?cardinal:1/cardinal;35 } 36 }37 else //0次幂38 {39 result =1;40 }41 return result;42 }

复制代码

输出小于指定数的所有素数

复制代码

1 /* 2 *    接受一个整数输入,然后显示所有小于或等于该数的素数 3 *    编译时请加 -lm 选项,链接到 math 库 4 *    author:成鹏致远 5 *    net:infodown.tap.cn 6 */ 7  8 #include 
9 #include
10 #include
11 12 bool IsPrime(int a);//判断是否为素数13 void PoutPrime(int a);//输出所有小于或等于该数的素数14 15 int main()16 {17 int nem;18 19 printf("Please input a number:");20 scanf("%d",&nem);21 22 PoutPrime(nem);23 24 return 0;25 }26 27 bool IsPrime(int a)//判断是否为素数28 {29 int i;30 int j = sqrt(a);31 32 for(i=2; i<=j; i++)33 {34 if(0 == a % i)35 {36 return false;37 }38 }39 return true;40 }41 42 void PoutPrime(int a)//输出所有小于或等于该数的素数43 {44 printf("小于或等于%d 的所有素数列表:\t",a);45 while(a)46 {47 if(IsPrime(a))48 {49 printf("%d\t",a);50 }51 a--;52 }53 printf("\n");54 }

复制代码

辗转相除法求最大公约数(铺砖)

复制代码

1 /* 2 * 返回两个整数的最大公约数,用辗转相除法求最大公约数 3 * 辗转相除法:铺地砖 4 * author:成鹏致远 5 * net:infodown.tap.cn 6 */ 7  8 #include 
9 10 int Divisor(int a, int b) //最大公约数11 {12 int temp;13 14 if(a < b)15 {16 a = a ^ b;17 b = a ^ b;18 a = a ^ b;19 }20 while(0 != b)21 {22 temp = a % b;23 a = b;24 b = temp;25 }26 return a; //最大公约数27 //最大公倍数为两数的乘积除以最大公约数28 }29 30 int main()31 {32 int a,b;33 34 printf("Please input two numbers:");35 scanf("%d%d",&a,&b);36 37 printf("%d 和%d 的最大公约数是%d \n",a,b,Divisor(a,b));38 }

复制代码

递归实现汉诺塔(递归思想)

复制代码

1 /* 2 * 递归实现汉诺塔 3 * @author:成鹏致远 4 * @net:infodown.tap.cn 5 */ 6  7 #include 
8 9 void move(char a, char b)//实现汉诺塔的移动10 {11 printf("%c—>%c \n",a,b);12 }13 14 15 /*16 * 功 能: 递归实现汉诺塔17 * n : 盘子个数18 * a,b,c: 三个盘座19 */20 void han_tower(int n, char a, char b, char c)21 {22 if(1==n)23 {24 move(a,c);25 }26 else27 {28 //将前n-1个盘子从a借助c移动到b29 han_tower(n-1,a,c,b);30 //将a上的第n个盘子移动到c31 move(a,c);32 //将剩下的n-1个盘子从b借助a移动到c33 han_tower(n-1,b,a,c);34 }35 }36 37 int main()38 {39 int num;40 41 printf("Pls input the number of diskes:");42 scanf("%d",&num);43 printf("the step to moving %d diskes: \n",num);44 han_tower(num,'A','B','C');45 46 return 0;47 }

复制代码

乒乓球比赛对手配对(匹配)

复制代码

1 /* 2 题目:两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定 3     比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出 4     三队赛手的名单。  5 */ 6  7 /* 8 *  @author: 成鹏致远  9 *  @net: http://infodown.tap.cn10 */11 12 #include 
13 14 int main(void)15 {16 char i,j,k;17 for(i='x';i<='z';i++)//a对手18 {19 for(j='x';j<='z';j++)//b对手20 {21 if(i!=j)//a,b同对22 {23 for(k='x';k<='z';k++)//c对手24 { 25 if(i!=k&&j!=k)//a,b,c同对26 { 27 if(i!='x' && k!='x' && k!='z')//a不和x比,c不和x,z比28 printf("order is a--%c\tb--%c\tc--%c \n",i,j,k);29 }30 }31 }32 }33 }34 35 return 0;36 }

复制代码

函数区间求最大值(方法)

复制代码

1 /* 2 编程:设x取值为区间[1,20]的整数,求函数f(x)=x-sin(x)- cos(x)的最大值 3 要求使用自定义函数实现f(x)功能 4 */ 5  6 /* 7 *  @author: 成鹏致远  8 *  @net: http://infodown.tap.cn 9 */10 11 #include "stdio.h"12 #include "math.h"13 double f()14 {15    int i;16    double max=0,x;17    for(i=1;i<=20;i++)18    {19      x=i-sin(i)-cos(i);20      if(x-max>1e-6)21        max=x;22    }23    return max;24 25 }26 main()27 {28     printf("%lf",f());29     getchar();30 }

复制代码

分解质因数

复制代码

1 /* 2 题目:将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 3 程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成: 4 (1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。 5 (2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n, 6   重复执行第一步。 7 (3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。 8 */ 9 10 #include 
11 #include
12 13 main()14 {15 int n,i;16 printf("please input a number:\n");17 scanf("%d",&n);18 printf("%d=",n);19 for(i=2;i<=sqrt(n);i++)20 {21 while(n!=i)22 {23 if(n%i==0)24 {25 printf("%d*",i);26 n=n/i;27 }28 else29 break;30 }31 }32 printf("%d \n",n);33 }

复制代码

古代买鸡问题

复制代码

1 /* 2 编程解决如下问题:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。 3 百钱买百鸡,问鸡翁,鸡母,鸡雏各几何? 4  5 解决方案:数学问题,先用数学方法解决 6 1、设鸡翁、鸡母、鸡雏分别a、b、c只 7 2、5a+3b+c/3=100 8 3、a+b+c=100 9 4、解得:b=(100-7*a)/4;10        c=(300+3*a)/4;11 12 */13 14 /*15 *  @author: 成鹏致远 16 *  @net: http://infodown.tap.cn17 */18 19 #include
20 21 void main()22 {23 int a,b,c;24 for(a=0;a<20;a++)25 {26 b=(100-7*a)/4;27 c=(300+3*a)/4;28 if(a+b+c==100&&a>=0&&b>=0&&c>=0)29 {30 printf("%d,%d,%d\n",a,b,c);31 }32 }33 }

复制代码

字符串交叉连接

复制代码

1 //输入两个字符串,要求将这两个字符串交叉连接。如串1为"ABCD",串2为"123456",则合并后的串为"A1B2C3D456"。 2  3 /* 4 *  @author: 成鹏致远  5 *  @net: http://infodown.tap.cn 6 */ 7  8 #include
9 #include
   10 void main()11 {12 char a[20],s[20],*p1,*p2;13 gets(a);14 gets(s);15 p1=a;16 p2=s;17 while(1)18 {19 if(*p1!='\0')20 { 21 printf("%c",*p1);p1++;22 }23 if(*p2!='\0')24 {25 printf("%c",*p2);26 p2++;27 }28 if(*p1=='\0' && *p2=='\0')29 exit(0);30 }31 }

复制代码

完数

复制代码

1 /* 2 题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程 3     找出1000以内的所有完数。 4 */ 5  6 /* 7 *  @author: 成鹏致远  8 *  @net: http://infodown.tap.cn 9 */10 11 #include 
12 13 int main(void)14 {15 static int k[10];16 int i,j,n,s;17 for(j=2;j<1000;j++)18 {19 n=-1;20 s=j;21 for(i=1;i<=j/2;i++)22 {23 if((j%i)==0) //因子24 {25 n++;26 s=s-i; //减到0则是完数27 k[n]=i;28 }29 }30 if(s==0)31 {32 printf("%d 是一个完数 \n%d=",j,j);33 for(i=0;i

复制代码

容器分水移动(算法)

复制代码

1 /* 2 编程解决如下数学问题:有12升水,怎样利用一个8升 3 和一个5升的容器将水分为两个6升?要求以如下格式 4 打印出分水步骤。 5 a12  b8  c5 6 12   0   0 7 *    *   * ( “*”表示当前状态下每个容器的盛水量) 8 ...... 9 6   6   010 */11 12 /*13 *  @author: 成鹏致远 14 *  @net: http://infodown.tap.cn15 */16 17 #include 
18 19 20 void move(int *ai,int *aj,int aiContainer,int ajContainer) //将油从一个容器导倒入另外一个容器21 { //移动容器目前盛水量,接收容器目前盛水量,移动容器容量,接收容器容量22 23 if(aiContainer>ajContainer) //移动容器容量>接收容器容量24 {25 if(*ai+*aj>ajContainer) //将油倒入接收容器中,移动容器有剩余26 {27 *ai=*ai-(ajContainer-*aj);28 *aj=*aj+ajContainer-*aj;29 }30 else //将油倒入接收容器中,移动容器无剩余31 {32 *aj=*ai+*aj; 33 *ai=*ai-*ai;34 }35 }36 else //移动容器容量
<接收容器容量,则全部倒入接收容器中37 {38 *aj="*ai+*aj;39" *ai="0;40" }41 }42 43 int main(void)44 {45 a[3]="{12,0,0},i,m=0;46" container[3]="{12,8,5};47" printf("%-8s%-8s%-8s\n","a12","b8","c5");48 printf("%-8d%-8d%-8d\n",a[0],a[1],a[2]);49 while(a[0]!="6)50" {51 for(i="0;i<3;i++)//循环三次,分别从a-">
b,b->c,c->a52 {53 move(&a[i],&a[(i+1)%3],container[i],container[(i+1)%3]);54 m++;55 printf("%-8d%-8d%-8d\n",a[0],a[1],a[2]);56 if(a[0]==6 && a[1]==6)57 {58 printf("The total number is %d to reach success!",m);59 getchar();60 return 0;61 }62 }63 move(&a[1],&a[2],container[1],container[2]);//b->c64 printf("%-8d%-8d%-8d\n",a[0],a[1],a[2]);65 m++;66 if(a[0]==6 && a[1]==6)67 {68 printf("The total number is %d to reach success!",m);69 break;70 }71 }72 getchar();73 return 0;74 }

复制代码

猴子吃桃问题(逆向思维)

复制代码

1 /* 2 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 3     第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下 4     的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。 5 1.程序分析:采取逆向思维的方法,从后往前推断。 6 */ 7  8 /* 9 *  @author: 成鹏致远 10 *  @net: http://infodown.tap.cn11 */12 13 #include 
14 15 int main(void)16 {17 int day,x1,x2;18 day=9;19 x2=1;20 while(day>0)21 {22 x1=(x2+1)*2;23 x2=x1;24 day--;25 }26 printf("the total is %d \n",x1);27 28 return 0;29 }

复制代码

统计字符数字等

复制代码

1 /* 2 题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数 3 */ 4  5 /* 6 *  @author: 成鹏致远  7 *  @net: http://infodown.tap.cn 8 */ 9 10 #include 
11 12 int main(void)13 {14 char c;15 int letters=0,space=0,digit=0,others=0;16 printf("please input some characters: \n");17 while((c=getchar())!='\n')18 {19 if(c>='a'&&c<='z'||c>='A'&&c<='Z')20 letters++;21 else if(c==' ')22 space++;23 else if(c>='0'&&c<='9')24 digit++;25 else26 others++;27 }28 printf("all in all:char=%d space=%d digit=%d others=%d \n",letters,space,digit,others);29 30 return 0;31 }

复制代码

贪心算法用例(够纠结的)

复制代码

1 /*  2 编程解决如下问题。  3   请在整数n=742683613984中删除8个数字,使得余下的数字按原次序组成的新数最小。要求如下:  4   (1)整数n和删除数字的个数“8”在源程序中完成赋值,程序直接输出运行结果;  5   (2)程序结果输出先后被删除的数字(之间以逗号分隔)和删除后所得的最小数。  6   (提示:整数n可以以字符数组的方式定义、赋值和处理)  7   8   编写思路:  9   在前9位数字中寻找最小数字a1,记下该最小数字的位置b1,a1前面所有数字是该删除的, 10   个数m=b1-1,然后从a1后面开始继续操作,变为删除8-m个数字,从a1后8-m+1个数字中找最小值a2, 11   记下b2,删除a1与a2之间的数字,个数b2-b1-1。m=m+b2-b1-1.如此下去直至m=8,停止操作, 12   输出a1a2……及最后一个a和之后的数字。 13  14   程序一是正确的,程序二是错误的 15   一和二的差别主要是在删除字符序列的顺序上 16 */ 17  18 /* 19 *  @author: 成鹏致远  20 *  @net: http://infodown.tap.cn 21 */ 22  23 //程序一:贪心算法 24  25 #include 
26 #include
27 28 int main() 29 { 30 int i,m=8,t=0; 31 char p[10]; 32 char s[]="742683613984"; 33 for (i=0;i<12;i++) 34 { 35 while(t&&p[t-1]>s[i]&&m) //用p数组中的每一个元素和当前s[i]比较 36 { 37 t--,m--; //进入循环意味着s[i]比p[--t]小,需要将p[--t]输出,并且m-1 38 printf("%c",p[t]); 39 if(m) //未删除所有符合条件的元素之前,用逗号将各元素分开 40 printf(","); 41 } 42 p[t++]=s[i]; //p数组依次暂存前一位比后一位小的数字 43 } //循环结束后p数组中存储着最小的四位数 44 p[t]=0; //字符数组结束 45 printf("\n"); 46 puts(p); 47 return 0; 48 } 49 50 51 52 /* 53 //程序二:这个是错误的,程序一和程序二的差别在删除字符序列的顺序 54 55 #include
56 #include
57 58 void main() 59 { 60 char *s="742683613984"; 61 printf("%s\n",s); 62 //去掉8个相当于取4个 63 int a,b,c,d;//下标 64 int aa,bb,cc,dd;//某位数字 65 int ka,kb,kc,kd;//最小值对应的下标 66 int min=10000;//当取4个时,设定初始最小值为5位数 67 int num;//组和的值 68 for(a=0;a<=8;a++) 69 { 70 for(b=1;b<=9;b++) 71 { 72 for(c=2;c<=10;c++) 73 { 74 for(d=3;d<=11;d++) 75 { 76 if((a

转载于:https://www.cnblogs.com/defias/p/3313692.html

你可能感兴趣的文章
帝国cms用户密码忘记怎么修改
查看>>
centos7删除PHP怎么操作
查看>>
如何移除woocommerce的tabs【wordpress技巧】
查看>>
微信公众平台已发送多图文消息支持删除单篇文章
查看>>
dedecms利用addfields body在首页调用文章内容
查看>>
Codeforces Round #353 (Div. 2)
查看>>
Educational Codeforces Round 27
查看>>
bzoj3876: [Ahoi2014&Jsoi2014]支线剧情
查看>>
ie6 IE7 IE8 多浏览器css兼容写法
查看>>
webpack实现scss编译配置
查看>>
C++ 补课 (三)
查看>>
Mac 下重新安装配置ibm Lotus 邮箱
查看>>
ansible 开源批量管理服务器工具
查看>>
JavaScript变量详解
查看>>
mongodb的查询操作符
查看>>
匈牙利算法实战codevs1022覆盖
查看>>
正则表达式(匹配的时候使用)
查看>>
AnsiString和String的区别、使用
查看>>
threeday
查看>>
找回 ie 图标
查看>>