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); } }
运行结果:
大家还可以考虑一下,如何打印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; }
运行结果:
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(" "); }
运行结果:
19.将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
//将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 void DivideFactor(int n) { int i; printf(" please input a number: "); 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 ",x1); }
运行结果:
转载请标明出处:http://blog.csdn.net/u012027907/article/details/12720357