C语言常用算法

目录
基础算法

    1.大小字母写转换
    2.按序向数组插入数字
    3.求水仙花数
    4.将键盘输入字符串中出现的指定字符全部删除
    5.杨辉三角
    6.从键盘上输入5个数,输出最大、最小元素的值以及他们的下标
    7.求两个数的最小公倍数
    8.求两、三个数中较大者的函数
    9.电文加密问题
    10.冒泡排序法
    11.字符数组逆序排列
    12.递归调用(求n的阶乘)
    13.求1到n阶乘的和	

基础算法

  • 1.从键盘输入一个字符串,将其中的大写字母变小写字母,小写字母变大写字母,并输出。

    #include
    void main()
    {
           
        int i;
        char a[20];
        //输入字符串
        printf("请输入字符串的内容:\t");
        do{
           
            scanf("%c", &a[i]);
            i++;
        }while(a[i - 1] != '\n');
        a[i] = '\0';
        printf("*******************************\n");
        printf("\n输入字符串的内容:\t");
        i = 0;
        while(a[i] != '\0')
        {
           
            printf("%c", a[i]);
            i++;
        }
        printf("*******************************\n");
        printf("转换后字符串的内容:\t");
        i = 0;
        char c;
        while(a[i] != '\0')
        {
           
            c = a[i];
            if(c >= 'a' && c <= 'z')
                a[i] -= 32;
            else if(c >= 'A' && c <= 'Z')
                a[i] += 32;
            printf("%c", a[i]);
            i++;
        }
    }
    
  • 2.把一个整数按大小顺序插入已排好序的数组中

    #include
    void main()
    {
           
        int i, j, p, q, s, n;
        int a[11] = {
           11, 12, 13, 14, 15, 10, 19, 18, 17, 16 };
        for(i = 0; i < 10; i++)
        {
           
            p = i; q = a[i];
            for(j = i + 1; j < 10; j++)
                if(q < a[j])
                {
           
                    p = j;
                    q = a[j];
                }
            if(p != i)
            {
           
                s = a[i];
                a[i] = a[p];
                a[p] = s;
            }
            printf("%d\t", a[i]);
        }
        printf("\n***********************************************\n");
        printf("input number:\n");
        scanf("%d", &n);
        for(i = 0; i < 10; i++)
            if(n > a[i])
            {
           
                for(s = 9; s >= i; s--)
                    a[s + 1] = a[s];
                break;
            }
        a[i] = n;
        printf("***************************************************\n");
        for(i = 0; i <= 10; i++)
            printf("%d\t", a[i]);
    }
    
  • 3.求水仙花数:输入一个三位数,判断是否是一个水仙花数。(水仙花数是指3位数的各个位数字的立方和等于这个3位数本身。)

    #include 
    void main()
    {
           
         int i, n, x1, x2, x3, sum;
         for(i = 153; i < 1000; i++)
         {
           
             n = i;
             x1 = n % 10;
             x2 = n / 10 % 10;
             x3 = n / 100;
             sum = x1 * x1 * x1 + x2 * x2 * x2 + x3 * x3 * x3;
             if(sum == i)
                printf("%d is a narcissus number!\n", i);
         }
    }
    
  • 4.从键盘输入一个字符串与一个指定字符,将字符串中出现的指定字符全部删除。

    #include 
    #include 
    void prochar(char *str, char c)
    {
           
        char *p;
        for(p = str; *p != '\0'; p++)
            if(*p != c)
                *str ++= *p;
        *str = '\0';
    }
    void main()
    {
           
        char str[80], char_c;
        printf("请输入字符串:");
        gets(str);
        printf("请输入要删除的指定字符:");
        scanf("%c", &char_c);
        prochar(str, char_c);
        puts(str);
    }
    
  • 5.杨辉三角

     #include 
     #define N 10
     void yanghui_triangle(int a[][N], int n);
    
     void main()
     {
           
         int i, j, n, b[N][N];
         printf("【行数不能超过所定义的N的值】请输入行数:");
         scanf("%d", &n);
         yanghui_triangle(b, n);
         for(i = 0; i < n; i++)
         {
           
             for(j = 0; j <= i; j++)
                printf("%-4d", b[i][j]);
             printf("\n");
         }
    
     }
    
     void yanghui_triangle(int a[][N], int n)
     {
           
         int i,j;
         for(i = 0; i < n; i++)     //生成三角形边上的元素
         {
           
            a[i][0] = 1;        //0列与i列i行的元素为1
            a[i][i] = 1;
         }
         for(i = 2; i < n; i++)
            for(j = 1; j < i; j++)
                a[i][j] = a[i - 1][j - 1] + a[i -1][j];
     }
    
  • 6.从键盘上输入5个数,输出最大、最小元素的值以及他们的下标

    #include 
    #define N 5
    void main()
    {
           
        int i, j, k, max, min;
        static int a[5];
        for(i = 0; i < 5; i++)
        {
           
            printf("请输入第%d个数字:", i + 1);
            scanf("%d", &a[i]);
        }
        max = min = a[0];
        j = k = 0;
        for(i = 0; i < 5; i++)
        {
           
            if(max < a[i])
            {
           
                max = a[i];
                j = i;
            }
            else if(min > a[i])
            {
           
                min = a[i];
                k = i;
            }
        }
        printf("max : a[%d] = %d, min : a[%d] = %d", j, max, k, min);
    }
    
  • 7.求两个数的最小公倍数。

    #include 
    
    int divisor(int a, int b);
    int multiple(int a, int b);
    
    void main()
    {
           
        int a, b, c;
        printf("输入第一个数a:");
        scanf("%d", &a);
        printf("输入第二个数b:");
        scanf("%d", &b);
        c = multiple(a, b);
        printf("a和b的最小公倍数c为:%d", c);
    }
    int divisor(int a, int b)
    {
           
        int r;
        while((r = a % b) != 0)
        {
           
            a = b;
            b = r;
        }
        return b;
    }
    int multiple(int a, int b)
    {
           
        int d;
        d = divisor(a, b);
        return a * b / d;
    }
    
  • 8.求两、三个数中较大者的函数

    #include 
    
    int max(int,  int, int);
    
    void main()
    {
           
        int a, b, c, t;
        printf("依次输入三个数:\n请输入第一个数:");
        scanf("%d", &a);
        printf("请输入第二个数:");
        scanf("%d", &b);
        printf("请输入第三个数:");
        scanf("%d", &c);
        t = max(a, b, c);
        printf("max : %d", t);
    }
    int max(int a, int b, int c)
    {
           
        int t;
        if(a > b)
            if(a > c)
                t = a;
            else
                t = c;
        else
            if(b > c)
                t = b;
            else
                t = c;
        return t;
    }
    
  • 9.电文加密问题

    【释义】已知电文加密规律为:将字母变成其后面的第3个字母,其他字符保持不变。例如:a变为d。

    #include 
    void main()
    {
           
        char ch;
        printf("请输入字符串:");
        while((ch = getchar()) != '\n')
        {
           
            if((ch >= 'a' && ch  <= 'z') || (ch >= 'A' && ch <= 'Z'))
            {
           
                ch += 3;    //对字母进行加密处理
                if((ch > 'Z' && ch < 'a') || (ch > 'z'))
                    ch -= 26;   //加密后越界进行处理
            }
            printf("%c", ch);
        }
    }
    

    用getchar()函数进行字符的输入,不是从键盘硬件中读取输入的字符,而是从“输入缓冲区”读取字符。

  • 10.冒泡排序法

1.比较第一个数与第二个数,若为逆序a[0]>a[1],则交换;
然后比较第二个数与第三个数;
依次类推,直至第n - 1个数和第n个数比较为止——第一趟冒泡排序,结果最大的数被安置在最后一个元素位置上
2.对前n - 1个数进行第二趟冒泡排序,结果使次大的数被安置在第n - 1个元素位置;
3.重复上述过程,共经过n - 1趟冒泡排序后,排序结束。

#include 
void main()
{
     
    int a[11], i, j, t;
    printf("input 10 numbers:\n");
    for(i = 1; i < 11; i++)
        scanf("%d", &a[i]);
    printf("the unsorted numbers:\n");
    for(i = 1; i < 11; i++)
        printf("%d\t", a[i]);
    printf("\n*********************************\n");
    for(j = 1; j <= 9; j++)
        for(i = 1; i <= 10 - j; i++)
            if(a[i] > a[i + 1])
            {
     
                t = a[i];
                a[i] = a[i + 1];
                a[i + 1] = t;
            }
    printf("the sorted numbers:\n");
    for(i = 1; i < 11; i++)
        printf("%d\t", a[i]);
}
  • 11.字符数组逆序排列

【释义】把输入的字符串逆序排列,如输入ABCDE,输出EDCBA

#include 
#include 
int main()
{
     
    char c, str[80];
    int i, j;
    printf("Input character array with keyboard:\n");
    gets(str);
    for(i = 0, j = strlen(str) - 1; i < j; i++, j--)
    {
     
        c = str[i];
        str[i] = str[j];
        str[j] = c;
    }
    printf("Reversed string:%s", str);
    return 0;
}
  • 12.递归调用(求n的阶乘)
#include 
float fac(int n)
{
     
    float f;
    if(n < 0)
    {
     
        printf("n < 0, data error!");
    }
    else if(n == 0 || n == 1)
    {
     
        f = 1;
    }
    else
        f = fac(n - 1) * n;
    return f;
}
int main()
{
     
    int n, y;
    printf("Input a integer number:");
    scanf("%d", &n);
    y = fac(n);
    printf("%d!=%d", n, y);
    return 0;
}
  • 13.求1到n阶乘的和
#include 
float fac(int n)
{
     
    float f;
    if(n < 0)
    {
     
        printf("n < 0, input error!");
    }
    else if(n == 0 || n == 1)
        f = 1;
    else
        f = fac(n - 1) * n;
    return f;
}
int main()
{
     
    int n, i;
    float y = 0;
    printf("input a figure:\n");
    scanf("%d", &n);
    for(i = 0; i <= n; i++)
        y = y + fac(i);
    printf("%d!=%f", n, y);
    return 0;
}

你可能感兴趣的:(C语言)