• 在学C语言的人,怎能不了解这些经典算法问题?


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


     

    一、古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(兔子的规律为数列1,1,2,3,5,8,13,21....)这也是著名的斐波那契数列。

    //斐波那契数列

    void Fabocci()

    {

    long int f1,f2;

    f1 = f2 = 1;

    int i;

    for(i = 1; i <= 20; i++)

    {

    printf("%12ld %12ld ",f1,f2);

    if(i % 2 == 0)    //控制输出,每行输出4个

    printf(" ");

    f1 = f1+f2;      //后一个数是前两个数的和

    f2 = f1+f2;      //后一个数是前两个数的和

    }

    }

    二、1-100之间有多少个素数,并输出所有素数及素数的个数。程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。

    //输出1-100的所有素数

    void Prime()

    {

    int i,j,flag,n;

    n = 100;  //100以内的素数

    flag = 1;  //标识变量,是素数则为1

    for(i = 2; i <= 100; i++)  //从2开始,遍历到100

    {

    flag = 1;

    for(j = 2; j*j <= i; j++) //能被2 - sqrt(i)整除的数

    {

    if(i % j == 0)

    {

    flag = 0;

    break;

    }

    }

    if(flag == 1)

      printf("%d ",i);  //输出素数

    }

    }

    三、一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6 = 1+2+3

    找出10000以内的所有完数。

    //找出1000以内的所有完数(一个数等于其因子之和)

    void PerfectNumber()

    {

    int p[80];  //保存分解的因子

    int i,num,count,s,c = 0;

        int MaxNum = 10000;

    for(num = 2; num < MaxNum; num++)

    {

    count = 0;

    s = num;

    for(i = 1; i < num/2+1; i++)      //循环处理每个数

    {

    if(num % i == 0)          //能被i整除

    {

    p[count++]  = i;      //保存因子,让计数器count增加1

    s -= i;              //减去一个因子

    }

    }

    if( 0 == s)

    {

    printf("%4d是一个完数,因子是:",num);

    printf("%d = %d",num,p[0]);  //输出完数

    for(i = 1; i < count; i++)

    printf("+%d",p[i]);

    printf(" ");

    c++;

    }

    }

    printf(" 共找到%d个完数。 ",c);

    }

    四、输出9*9乘法口诀。

    //9*9乘法口诀表

    void Table99()

    {

    int i,j;

    for(i = 1; i <= 9; i++)    //外层循环控制行

    {

    for(j = 1; j <= i; j++) //内层循环控制列

    {

    printf("%d*%d=%-4d",i,j,i*j);

    }

    printf(" ");

    }

    }

    五、编程打印杨辉三角

    //打印杨辉三角

    void YangHuiTriangle()

    {

    int i,j,triangle[8][8];

    for(i = 0; i < 8; i++)

    for(j = 0; j < 8; j++)

    triangle[i][j] = 1;

    for(i = 2; i < 8; i++)

    {

    for(j = 1; j < i; j++)

    {

    triangle[i][j] = triangle[i-1][j]+triangle[i-1][j-1];

    }

    }

    for(i = 0; i < 8; i++)

    {

    for(j = 0; j <= i; j++)

    printf("%-4d",triangle[i][j]);

    printf(" ");

    }

    }

    六、下面程序的功能是将一个4×4的数组进行逆时针旋转90度后输出,要求原始数组的数据随机输入,新数组以4行4列的方式输出。

    void Array4_4()

    {

    int A[4][4],B[4][4],i,j;

    printf("Please Input 16 numbers:");

    for(i = 0; i < 4; i++)

    for(j = 0; j < 4; j++)

    {

    scanf("%d",&A[i][j]);  //输入16个数

    B[3-j][i] = A[i][j];  //旋转90度赋值

    }

    printf("Array A: ");          //输出矩阵A

    for( i = 0; i < 4; i++)

    {

    for(j = 0 ; j < 4; j++)

    {

    printf("%4d",A[i][j]);

    }

    printf(" ");

    }

    printf("Array B: ");          //输出矩阵B

    for( i = 0; i < 4; i++)

    {

    for(j = 0 ; j < 4; j++)

    {

    printf("%4d",B[i][j]);

    }

    printf(" ");

    }

    }

    七、实现将输入的字符串反序输出。

    /*实现字符串翻转*/

    char* reverse_str(char* str)

    {

    if(NULL == str) //字符串为空直接返回

    {

    return str;

    }

    char *begin;

    char *end;

    begin = end = str;

    while(*end != '') //end指向字符串的末尾

    {

    end++;

    }

    --end;

    char temp;

    while(begin < end) //交换两个字符

    {

    temp = *begin;

    *begin = *end;

    *end = temp;

    begin++;

    end--;

    }

    return str; //返回结果

    }

    八、输入一个字符串,判断其是否为回文。回文字符串是指从左到右读和从右到左读完全相同的字符串。

    //判断一个字符串是否是回文

    void IsHuiWen()

    {

    char str[100];

    int i,j,n;

    printf("请输入一段字符串:");

    gets(str);

    n = strlen(str);

    for(i = 0,j = n-1; i < j; i++,j--)

    if(str[i] != str[j])

    break;

    if(i >= j)

    printf("是回文! ");

    else

    printf("不是回文! ");

    }

    九、求近似Pi值。可以用公式(如:pi/2 = 1+1/3+1/3*2/5 + 1/3*2/5*3/7 + 1/3*2/5*3/7*4/9+.....)

    void Pi()

    {

    double pi = 2,temp = 2;            //初始化pi值和临时值

    int numerator = 1,denominator = 3; //初始化分子和分母

    while(temp > 1e-16)                //数列大于指定精度

    {

    temp = temp*numerator/denominator;//计算一个数列的值

    pi += temp;

    numerator++;

    denominator += 2;

    }

    printf("PI = %.18f ",pi);

    }

    十、实现字符串拷贝函数strcopy(char*src,char* dest)

    void strcopy(char *str, char *dest)

    {

    while(*str != '')

    {

    *dest++ = *str++;

    }

    *dest = '';

    }

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


     

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

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

    编程学习书籍:


     

    编程学习视频:


     
  • 相关阅读:
    随机算法之舍伍德算法
    KMP算法笔记
    分治法求解最大子段和问题
    递归与分治之间的关系
    微信公众号开发学习笔记(一)
    关于echo$PATH中的PTAH来源
    【Leetcode】807. Max Increase to Keep City Skyline
    【Leetcode】804. Unique Morse Code Words
    【Leetcode】709. To Lower Case
    【Leetcode】Jewels and Stones
  • 原文地址:https://www.cnblogs.com/mu-ge/p/14110736.html
Copyright © 2020-2023  润新知