博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言经典算法100例(二)
阅读量:5037 次
发布时间:2019-06-12

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

 

11.判断某一年是否是闰年。

//判断某一年份是否是闰年int IsLeapYear(int year){	return (year % 400 == 0 || (year % 4 == 0) && (year % 100 != 0));}

运行结果:

12.获得某年、某月的最大天数。

//获得某年、某月的最大天数int GetMaxDay(int year,int month){	switch(month)	{	case 1:	case 3:	case 5:	case 7:	case 8:	case 10:	case 12:		return 31;	case 4:	case 6:	case 9:	case 11:		return 30;	case 2:		return IsLeapYear(year)?29:28;			default:return -1;	}}

运行结果:

13.输入某年某月某日,判断这一天是这一年的第几天?

//输入某年某月某日,判断这一天是这一年的第几天? /*  程序分析:以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊 情况,闰年且输入月份大于3时需考虑多加一天。*/int GetDays(int year,int month,int day){	int sum = 0;	int i;	for(i = 1; i < month; i++)      //将前几个月天数相加		sum += GetMaxDay(year,month);	sum = sum + day;  //加上本月的天数,就是总天数	return sum;}

运行结果:

更多关于日期的算法,请参见我的博客《》(java版)。

14.求一个数的阶乘。

//递归求阶乘long factorial(long n){	if(n <= 1)		return 1;	else 		return n * factorial(n-1);}//非递归求阶乘long Factorial(long n){	int sum,i;	sum = 1;	for(i = 1; i <= n; i++)		sum *= i;	return sum;}

运行结果:

这里求得的阶乘只能是较小数的阶乘,想求得200或更大数的阶乘就无能无力了,所以必须通过其他的算法来实现。

关于更大数的阶乘,大家可以参见我的博客《》

15.求两个数的最大公约数和最小公倍数。

//求两个数的最大公约数int gcd(int a,int b){	int r;	if(a < b)        //a < b,则交换两个数	{		int temp = a;		a = b;		b = temp;	}	r = a % b;	while(r != 0)	{		a = b;		b = r;		r = a % b;	}	return b;}//求两个数的最小公倍数数int lcm(int a,int b){	return a*b/gcd(a,b);}

运行结果:

16.打印出三位的"水仙花数",所谓"水仙花数"是指一个N位数,其各位数字立方和等于该数。

//打印出三位的"水仙花数",所谓"水仙花数"是指一个N位数,其各位数字立方和等于该数 void WaterFlowerNumber(){	int i,j,k,n;	printf("Water flower number is:");	for(n = 100; n < 1000; n++)	{		i = n/100; //分解百位		j = n/10 % 10; //分解十位		k = n % 10; //分解个位		if(i*i*i + j*j*j + k*k*k == n)			printf("%-5d\n",n);	}}

运行结果:

大家还可以考虑一下,如何打印21位“水仙花”数? (基本思想和《》及《》的思想相同,即用数组存储)。

17.不依赖第三个变量,实现两个整数交换。

/不依赖第三个变量,实现两个整数交换//第一种方法void Exchange1(int* a,int* b){	*a = *a + *b;	*b = *a - *b;	*a = *a - *b;}//第二种方法(用位运算)void Exchange2(int* a,int* b){	*a = *a ^ *b;	*b = *a ^ *b;	*a = *a ^ *b;}

运行结果:

18.将10进制的数转换为2-16进制。

//将10进制数转换为其它进制void From10baseTransformTo1_16(int m,int base){	char num[] = "0123456789ABCDEF";	char result[30] = {0};	int len = 0;	char temp;	int start = 0;	int end = len;		while(m)                //辗转相除,先存正向的余数	{		result[len++] = num[m%base];		m = m / base;	}	    start = 0;	end = len-1;	while(start < end)   //字符串翻转	{		temp = result[start];		result[start] = result[end];		result[end] = temp;		start++;		end--;	}  	start = 0;	for(start = 0; start < len; start++)    	printf("%c",result[start]);	printf("\n");}

运行结果:

19.将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。

//将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。void DivideFactor(int n){	int i; 	printf("\nplease input a number:\n"); 	scanf("%d",&n); 	printf("%d=",n); 	for(i=2;i<=n;i++) 	{ 		while(n!=i) 		{ 			if(n%i==0) 			{ 				printf("%d*",i); 		    	n=n/i; 			} 			else 			{				break;			}		} 	} 	printf("%d",n);}

运行结果:

20.猴子吃桃问题:

猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
程序分析:采取逆向思维的方法,从后往前推断。

void MonkeyEatPeach(){	int day,x1,x2;	day=9;	x2=1;	while(day>0)		 {x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/	 x2=x1;	 day--;	 }	printf("the total is %d\n",x1);}

运行结果:

转载请标明出处:

转载于:https://www.cnblogs.com/suncoolcat/p/3370816.html

你可能感兴趣的文章
日常报错
查看>>
list-style-type -- 定义列表样式
查看>>
hibernate生成表时,有的表可以生成,有的却不可以 2014-03-21 21:28 244人阅读 ...
查看>>
mysql-1045(28000)错误
查看>>
Ubuntu 编译出现 ISO C++ 2011 不支持的解决办法
查看>>
1.jstl c 标签实现判断功能
查看>>
Linux 常用命令——cat, tac, nl, more, less, head, tail, od
查看>>
超详细的Guava RateLimiter限流原理解析
查看>>
VueJS ElementUI el-table 的 formatter 和 scope template 不能同时存在
查看>>
Halcon一日一练:图像拼接技术
查看>>
Swift - RotateView
查看>>
iOS设计模式 - 中介者
查看>>
centos jdk 下载
查看>>
HDU 1028 Ignatius and the Princess III(母函数)
查看>>
关于多路复用器的综合结果
查看>>
(转)面向对象最核心的机制——动态绑定(多态)
查看>>
token简单的使用流程。
查看>>
django创建项目流程
查看>>
UIActionSheet 修改字体颜色
查看>>
Vue 框架-01- 入门篇 图文教程
查看>>