C语言经典算法100例(二)

来源:互联网 发布:php商城项目描述 编辑:程序博客网 时间:2024/05/18 14:27

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

[cpp] view plaincopy
  1. //判断某一年份是否是闰年  
  2. int IsLeapYear(int year)  
  3. {  
  4.     return (year % 400 == 0 || (year % 4 == 0) && (year % 100 != 0));  
  5. }  

运行结果:

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

[cpp] view plaincopy
  1. //获得某年、某月的最大天数  
  2. int GetMaxDay(int year,int month)  
  3. {  
  4.     switch(month)  
  5.     {  
  6.     case 1:  
  7.     case 3:  
  8.     case 5:  
  9.     case 7:  
  10.     case 8:  
  11.     case 10:  
  12.     case 12:  
  13.         return 31;  
  14.     case 4:  
  15.     case 6:  
  16.     case 9:  
  17.     case 11:  
  18.         return 30;  
  19.     case 2:  
  20.         return IsLeapYear(year)?29:28;        
  21.     default:return -1;  
  22.     }  
  23. }  

运行结果:

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

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


运行结果:

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

14.求一个数的阶乘。

[cpp] view plaincopy
  1. //递归求阶乘  
  2. long factorial(long n)  
  3. {  
  4.     if(n <= 1)  
  5.         return 1;  
  6.     else   
  7.         return n * factorial(n-1);  
  8. }  
  9. //非递归求阶乘  
  10. long Factorial(long n)  
  11. {  
  12.     int sum,i;  
  13.     sum = 1;  
  14.     for(i = 1; i <= n; i++)  
  15.         sum *= i;  
  16.     return sum;  
  17. }  

运行结果:

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

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

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

[cpp] view plaincopy
  1. //求两个数的最大公约数  
  2. int gcd(int a,int b)  
  3. {  
  4.     int r;  
  5.     if(a < b)        //a < b,则交换两个数  
  6.     {  
  7.         int temp = a;  
  8.         a = b;  
  9.         b = temp;  
  10.     }  
  11.   
  12.     r = a % b;  
  13.     while(r != 0)  
  14.     {  
  15.         a = b;  
  16.         b = r;  
  17.         r = a % b;  
  18.     }  
  19.     return b;  
  20. }  
  21. //求两个数的最小公倍数数  
  22. int lcm(int a,int b)  
  23. {  
  24.     return a*b/gcd(a,b);  
  25. }  

运行结果:

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

[cpp] view plaincopy
  1. //打印出三位的"水仙花数",所谓"水仙花数"是指一个N位数,其各位数字立方和等于该数   
  2. void WaterFlowerNumber()  
  3. {  
  4.     int i,j,k,n;  
  5.     printf("Water flower number is:");  
  6.     for(n = 100; n < 1000; n++)  
  7.     {  
  8.         i = n/100; //分解百位  
  9.         j = n/10 % 10; //分解十位  
  10.         k = n % 10; //分解个位  
  11.         if(i*i*i + j*j*j + k*k*k == n)  
  12.             printf("%-5d\n",n);  
  13.     }  
  14. }  

运行结果:

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


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

[cpp] view plaincopy
  1. /不依赖第三个变量,实现两个整数交换  
  2. //第一种方法  
  3. void Exchange1(int* a,int* b)  
  4. {  
  5.     *a = *a + *b;  
  6.     *b = *a - *b;  
  7.     *a = *a - *b;  
  8. }  
  9. //第二种方法(用位运算)  
  10. void Exchange2(int* a,int* b)  
  11. {  
  12.     *a = *a ^ *b;  
  13.     *b = *a ^ *b;  
  14.     *a = *a ^ *b;  
  15. }  

运行结果:


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

[cpp] view plaincopy
  1. //将10进制数转换为其它进制  
  2. void From10baseTransformTo1_16(int m,int base)  
  3. {  
  4.     char num[] = "0123456789ABCDEF";  
  5.     char result[30] = {0};  
  6.     int len = 0;  
  7.     char temp;  
  8.     int start = 0;  
  9.     int end = len;  
  10.       
  11.     while(m)                //辗转相除,先存正向的余数  
  12.     {  
  13.         result[len++] = num[m%base];  
  14.         m = m / base;  
  15.     }  
  16.       
  17.     start = 0;  
  18.     end = len-1;  
  19.     while(start < end)   //字符串翻转  
  20.     {  
  21.         temp = result[start];  
  22.         result[start] = result[end];  
  23.         result[end] = temp;  
  24.         start++;  
  25.         end--;  
  26.     }  
  27.     
  28.     start = 0;  
  29.     for(start = 0; start < len; start++)  
  30.         printf("%c",result[start]);  
  31.     printf("\n");  
  32.   
  33. }  

运行结果:


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

[cpp] view plaincopy
  1. //将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。  
  2. void DivideFactor(int n)  
  3. {  
  4.     int i;   
  5.     printf("\nplease input a number:\n");   
  6.     scanf("%d",&n);   
  7.     printf("%d=",n);   
  8.   
  9.     for(i=2;i<=n;i++)   
  10.     {   
  11.         while(n!=i)   
  12.         {   
  13.             if(n%i==0)   
  14.             {   
  15.                 printf("%d*",i);   
  16.                 n=n/i;   
  17.             }   
  18.             else   
  19.             {  
  20.                 break;  
  21.             }  
  22.         }   
  23.     }   
  24.     printf("%d",n);  
  25.   
  26. }  

运行结果:

20.猴子吃桃问题:

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

[cpp] view plaincopy
  1. void MonkeyEatPeach()  
  2. {  
  3.     int day,x1,x2;  
  4.     day=9;  
  5.     x2=1;  
  6.     while(day>0)  
  7.          {x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/  
  8.      x2=x1;  
  9.      day--;  
  10.      }  
  11.     printf("the total is %d\n",x1);  
  12. }  

运行结果:

转载请标明出处:http://blog.csdn.net/u012027907/article/details/12720357

0 0
原创粉丝点击