C语言经典算法100例(二)
来源:互联网 发布:淘宝买小样靠谱店推荐 编辑:程序博客网 时间:2024/05/21 06:28
11.判断某一年是否是闰年。
- //判断某一年份是否是闰年
- int IsLeapYear(int year)
- {
- return (year % 400 == 0 || (year % 4 == 0) && (year % 100 != 0));
- }
//判断某一年份是否是闰年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;
- }
- }
//获得某年、某月的最大天数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;
- }
//输入某年某月某日,判断这一天是这一年的第几天? /* 程序分析:以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;
- }
//递归求阶乘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);
- }
//求两个数的最大公约数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);
- }
- }
//打印出三位的"水仙花数",所谓"水仙花数"是指一个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位“水仙花”数? (基本思想和《大数阶乘的实现》及《求任意位数的Pi》的思想相同,即用数组存储)。
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;
- }
/不依赖第三个变量,实现两个整数交换//第一种方法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");
- }
//将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);
- }
//将一个正整数分解质因数。例如:输入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);
- }
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);}
运行结果:
- C语言经典算法100例(二)
- C语言经典算法100例(二)
- C语言经典算法100例(二)
- C语言经典算法100例(二)
- C语言经典算法100例(二)
- C语言经典算法100例
- C语言经典算法100例
- C语言经典算法100例-结束语
- C语言经典算法100例001
- C语言经典算法100例002
- C语言经典算法100例003
- C语言经典算法100例004
- C语言经典算法100例005
- C语言经典算法100例006
- C语言经典算法100例
- C语言经典算法100例
- (转) 经典C语言算法 100例
- c语言经典算法100例1(转载)
- C语言经典算法100例(一)
- Delphi中TWebBrowser的使用,实现IDocHostUIHandler接口
- jquery源码阅读知识储备(3)exec() 方法和match方法
- TabHost的子Activity中onActivityResult 不响应解决方案
- 感兴趣的
- C语言经典算法100例(二)
- 利用busybox制作yaffs2文件系统
- 使用Backtrace函数打印调用栈 - Debug居家必备
- 使用Python2.7操作Selenium2时只打开浏览器不load URL的解决方法
- SharePoint咨询师之路:设计之前的那些事一:容量
- jsp显示中文名图片
- java:byte short int long float double char
- 移植linux-2.6.36内核
- C++学习笔记