判断日期为一年中的第几天(考虑闰年)
1 /* 2 * 计算该日在本年中是第几天,注意闰年问题 3 * 以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天 4 * 特殊情况,闰年且输入月份大于3时需考虑多加一天 5 */ 6 7 /* 8 *@author: 成鹏致远 9 *@net: http://infodown.tap.cn 10 */ 11 12 #include <stdio.h> 13 #include <stdbool.h> 14 15 struct year_mon_day 16 { 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 "); 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天 ",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 <stdio.h> 8 #include <stdbool.h> 9 #define LIM 32 10 11 int main(void) 12 { 13 int decimal; 14 bool negative = false; 15 printf("pls input the integer to convert: "); 16 17 if(!scanf("%d", &decimal)) 18 { 19 printf("we need an integer, Bye-bye! "); 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<LIM && decimal!=0; i++) 30 { 31 num[i] = decimal%16; 32 decimal /= 16; 33 } 34 35 int j; 36 if(negative) 37 printf("answer: -0x"); 38 else 39 printf("answer: 0x"); 40 41 for(j=i; j>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 } //switch 65 } //for 66 printf(" "); 67 68 return 0; 69 }
打印指定的字母金字塔(技巧)
1 /* 2 * 产生一个字母金字塔图案 3 * author:成鹏致远 4 * net:infodown.tap.cn 5 */ 6 7 #include <stdio.h> 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<len; i++) //打印出金字塔图案 58 { 59 for(j=0; j<len2; j++) 60 { 61 printf("%c",tem[i][j]); 62 } 63 printf(" "); 64 } 65 }
求float型数的幂
1 /*用循环的方法实现,返回一个float 类型数的某个整数次幂,保留六位小数*/ 2 /* 3 *@author: 成鹏致远 4 *@net: http://infodown.tap.cn 5 */ 6 7 #include <stdio.h> 8 #include <math.h> 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 ",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 <stdio.h> 9 #include <stdbool.h> 10 #include <math.h> 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 的所有素数列表: ",a); 45 while(a) 46 { 47 if(IsPrime(a)) 48 { 49 printf("%d ",a); 50 } 51 a--; 52 } 53 printf(" "); 54 }
辗转相除法求最大公约数(铺砖)
1 /* 2 * 返回两个整数的最大公约数,用辗转相除法求最大公约数 3 * 辗转相除法:铺地砖 4 * author:成鹏致远 5 * net:infodown.tap.cn 6 */ 7 8 #include <stdio.h> 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 ",a,b,Divisor(a,b)); 38 }
递归实现汉诺塔(递归思想)
1 /* 2 * 递归实现汉诺塔 3 * @author:成鹏致远 4 * @net:infodown.tap.cn 5 */ 6 7 #include <stdio.h> 8 9 void move(char a, char b)//实现汉诺塔的移动 10 { 11 printf("%c—>%c ",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 else 27 { 28 //将前n-1个盘子从a借助c移动到b 29 han_tower(n-1,a,c,b); 30 //将a上的第n个盘子移动到c 31 move(a,c); 32 //将剩下的n-1个盘子从b借助a移动到c 33 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: ",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.cn 10 */ 11 12 #include <stdio.h> 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 b--%c c--%c ",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 <stdio.h> 11 #include <math.h> 12 13 main() 14 { 15 int n,i; 16 printf("please input a number: "); 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 else 29 break; 30 } 31 } 32 printf("%d ",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.cn 17 */ 18 19 #include<stdio.h> 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 ",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<stdio.h> 9 #include<stdlib.h> 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!='