当前位置:   article > 正文

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

c语言经典算法100例

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

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

运行结果:

 

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

  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.输入某年某月某日,判断这一天是这一年的第几天?

  1. //输入某年某月某日,判断这一天是这一年的第几天?
  2. /*
  3. 程序分析:以35日为例,应该先把前两个月的加起来,然后再加上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. }

运行结果:

 

14.求一个数的阶乘。

  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.求两个数的最大公约数和最小公倍数。

  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. r = a % b;
  12. while(r != 0)
  13. {
  14. a = b;
  15. b = r;
  16. r = a % b;
  17. }
  18. return b;
  19. }
  20. //求两个数的最小公倍数数
  21. int lcm(int a,int b)
  22. {
  23. return a*b/gcd(a,b);
  24. }

运行结果:

 

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

  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.不依赖第三个变量,实现两个整数交换。

  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进制。

  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. while(m) //辗转相除,先存正向的余数
  11. {
  12. result[len++] = num[m%base];
  13. m = m / base;
  14. }
  15. start = 0;
  16. end = len-1;
  17. while(start < end) //字符串翻转
  18. {
  19. temp = result[start];
  20. result[start] = result[end];
  21. result[end] = temp;
  22. start++;
  23. end--;
  24. }
  25. start = 0;
  26. for(start = 0; start < len; start++)
  27. printf("%c",result[start]);
  28. printf("\n");
  29. }

运行结果:

 

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

  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. for(i=2;i<=n;i++)
  9. {
  10. while(n!=i)
  11. {
  12. if(n%i==0)
  13. {
  14. printf("%d*",i);
  15. n=n/i;
  16. }
  17. else
  18. {
  19. break;
  20. }
  21. }
  22. }
  23. printf("%d",n);
  24. }

运行结果:

 

20.猴子吃桃问题:

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

  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. }

运行结果:

 

 

 

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/417439
推荐阅读
相关标签
  

闽ICP备14008679号