C语言基础算法

目录
基础算法

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

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

#include<stdio.h>
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<stdio.h>
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 <stdio.h>
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 <stdio.h>
#include <string.h>
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 <stdio.h>
 #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 <stdio.h>
#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.求两个数的最小公倍数。

如果求a和b的最小公倍数,可以先求出它们的最大公约数,最小公倍数就是 a*b/最大公约数

#include <stdio.h>

int divisor(int a, int b);

int main()
{
    int a, b, c;
    printf("输入第一个数a:");
    scanf("%d", &a);
    printf("输入第二个数b:");
    scanf("%d", &b);
    c = divisor(a, b);
    printf("最大公约数c:%d\n", c);
    c = a * b / c;
    printf("a和b的最小公倍数c为:%d", c);

	return 0;
}

int divisor(int a, int b)
{
    int r;
    while((r = a % b) != 0)
    {
        a = b;
        b = r;
    }
    return b;
}

8.求两、三个数中较大者的函数

#include <stdio.h>

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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
#include <string.h>
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 <stdio.h>
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 <stdio.h>
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;
}
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值