您的位置:首页 > 编程语言 > C语言/C++

C语言经典算法02

2013-12-24 00:34 232 查看


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

[cpp] view
plaincopy

//判断某一年份是否是闰年  

int IsLeapYear(int year)  

{  

    return (year % 400 == 0 || (year % 4 == 0) && (year % 100 != 0));  

}  

运行结果:




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

[cpp] view
plaincopy

//获得某年、某月的最大天数  

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

[cpp] view
plaincopy

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

/*   

程序分析:以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.求一个数的阶乘。

[cpp] view
plaincopy

//递归求阶乘  

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

[cpp] view
plaincopy

//求两个数的最大公约数  

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位数,其各位数字立方和等于该数。

[cpp] view
plaincopy

//打印出三位的"水仙花数",所谓"水仙花数"是指一个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.不依赖第三个变量,实现两个整数交换。

[cpp] view
plaincopy

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

//第一种方法  

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

[cpp] view
plaincopy

//将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。

[cpp] view
plaincopy

//将一个正整数分解质因数。例如:输入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天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

程序分析:采取逆向思维的方法,从后往前推断。

[cpp] view
plaincopy

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);  

}  

运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法