zoukankan      html  css  js  c++  java
  • 学了这么久的C语言,原来可以这样解决算法问题...

    C语言中有有许多经典的算法,这些算法都是许多人的智慧结晶,也是编程中常用的算法,这里面包含了众多算法思想,掌握这些算法,对于学习更高级的、更难的算法都会有很大的帮助,会为自己的算法学习打下坚实的基础。


     

    1、猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第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);

    }

    2、将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(" ");

    }

    3、将一个正整数分解质因数。例如:输入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);

    }

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

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

    //第一种方法

    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;

    }

    5、打印出三位的"水仙花数",所谓"水仙花数"是指一个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);

    }

    }

    6、求两个数的最大公约数和最小公倍数。

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

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

    }

    7、求一个数的阶乘。

    //递归求阶乘

    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;

    }

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

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

    /* 

    程序分析:以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;

    }

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

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

    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;

    }

    }

    10、判断某一年是否是闰年。

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

    int IsLeapYear(int year)

    {

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

    }

    以上就是我的分享,有什么问题欢迎大家评论区留言。


     

    最后,如果你也想成为程序员,想要快速掌握编程,赶紧加入学习企鹅圈子!

    里面有资深专业软件开发工程师,在线解答你的所有疑惑~编程语言入门“so easy”

    编程学习书籍:


     

    编程学习视频:


     
  • 相关阅读:
    #include "stdafx.h" 错误?
    扩频技术
    求数组中只出现一次的数字(算法)
    1.3一摞烙饼的排序
    嵌套类
    企业级邮件服务软件推荐
    关于Linq To Sql中Detach方法和一个公共基类
    asp.net(c#) 将dbf转换为xls或wps,并将数据的列名改成中文;并判断本机是否安装office2003,2007和wps2007,2010
    一句代码解决IE8兼容问题(兼容性视图)
    asp.net(C#)套用模板操作Excel
  • 原文地址:https://www.cnblogs.com/mu-ge/p/14114007.html
Copyright © 2011-2022 走看看