zoukankan      html  css  js  c++  java
  • C语言经典算法100例(二)

    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

  • 相关阅读:
    vue箭头函数问题
    JS函数知识点梳理
    因tensorflow版本升级ImportError: No module named 'tensorflow.models.rnn'
    数据库优化,以实际SQL入手,带你一步一步走上SQL优化之路!
    在 IntelliJ IDEA 中这样使用 Git,效率提升2倍以上
    百万级高并发mongodb集群性能数十倍提升优化实践
    阿里巴巴Java开发手册正确学习姿势是怎样的?刷新代码规范认知
    50道Redis面试题史上最全,以后面试再也不怕问Redis了
    没想到Spring Boot居然这么耗内存,有点惊讶
    源码角度分析-newFixedThreadPool线程池导致的内存飙升问题
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3370816.html
Copyright © 2011-2022 走看看