C语言知识(5)

该博客主要展示了一系列C语言实例,涵盖数学计算,如求平均值、最大公约数等;逻辑判断,如判断奇数、闰年等;字符串操作,如逆序打印、左旋等;还有一些趣味问题,如汽水问题、选手排名判断等,体现了C语言在不同场景的应用。

C语言实例

1、求三个数的平均值

float AVE(float x, float y, float z)
{
        float aver;
        aver = (x + y + z) / 3;
        return aver;
}
int main()
{
        float a = 6.5;
        float b = 4.2;
        float c = 25.4;
        float ave = 0;
        ave = AVE(a, b, c);
        printf("ave=%f\n", ave);
}

在这里插入图片描述

2、求两个数的较大值

int main()
{
        int a, b;
        printf("请输入两个数:");
        scanf("%d,%d", &a, &b);
        if (a > b)
               printf("%d\n", a);
        else
               printf("%d\n", b);
}

3、求圆面积

#define PI 3.14159 //宏替换
int main()
{
        float r, s;
        system("cls");//清屏
        printf("请输入半径:");
        scanf("%f", &r);
        if (r < 0)//半径不能为负数
        {
               printf("输入错误\n");
               exit(0);//停止程序执行,返回操作系统
        }
        s = PI * pow(r, 2);//pow函数求次方
        printf("圆的面积为:%.3f\n", s);//限制小数位数
}

在这里插入图片描述

4、交换两个数字

int main()
{
        int a = 3;//011
        int b = 5;//101
        printf("交换前a=%d,b=%d\n", a, b);



        //1.使用第三方变量
        //int c = 0;
        //c = a;
        //a = b;
        //b = c;

        



        //2.使用两数和,容易造成整型溢出 INT_MAX
        //a = a + b; //a是和,b还是原来的b
        //b = a - b;//b得到原来的a
        //a = a - b;//a得到原来的b




        //3.按二进制位异或 相同为0,相异为1
        a = a ^ b;//a=110 b=101
        b = a ^ b;//b=011 a=110
        a = a ^ b;//a=101 b=011

        printf("交换后a=%d,b=%d\n", a, b);
        
}

5、找出整型中的单身狗

int main()
{
        int arr[] = { 1,2,3,4,5,1,2,3,4 };



        //1.暴力求解
        /*int i = 0;
        int j = 0;
        int sz = sizeof(arr) / sizeof(arr[0]);
        for (i = 0; i < sz; i++)
        {
               int count = 0;
               for (j = 0; j < sz; j++)
               {
                       if (arr[i] == arr[j])
                       {
                              count++;
                       }
               }
               if (count == 1)
               {
                       printf("单身狗:%d\n", arr[i]);
               }
        }*/





        //2.异或 只能找到一只单身狗
        int i = 0;
        int ret = 0;
        int sz = sizeof(arr) / sizeof(arr[0]);
        for (i = 0; i < sz; i++)
        {
               ret = ret ^ arr[i];
        }
        printf("单身狗:%d\n", ret);

}

6、将三个数从大到小输出

int main()
{
        int a, b, c;
        scanf("%d %d %d", &a, &b, &c);
        if (a < b)
        {
               int tem = a;
               a = b;
               b = tem;
        }
        if (a < c)
        {
               int tem = a;
               a = c;
               c = tem;
        }
        if (b < c)
        {
               int tem = b;
               b = c;
               c = tem;
        }
        printf("%d %d %d\n", a, b, c);
}

7、打印3的倍数

int main()
{
        int i = 0;
        for (i = 1; i <= 100; i++)
        {
               if (i % 3 == 0)
               {
                       printf("%d\n", i);
               }
        }
}

8、判断一个数是否为奇数

int main()
{
        int num;
        scanf("%d", &num);
        if (num % 2 == 1)
        {
               printf("是奇数");
        }
        else
        {
               printf("不是奇数");
        }
        return 0;
}

在这里插入图片描述

9、输出1-100之间的奇数

int main()
{
        int i=0;
        while (i < 100)
        {
               i++;
               if (i % 2 == 1)
               printf("%d\n", i);
        }
        return 0;
}


int main()
{
        int i=1;
        while (i < 100)
        {
               printf("%d\n", i);
               i += 2;
        }
        return 0;
}

在这里插入图片描述

10、求两数的最大公约数

int main()
{
        int m, n, r;
        scanf("%d %d", &m, &n);
        while (r=m%n)
        {
               m = n;
               n = r;
        }
        printf("%d\n", n);
}

11、打印1000-2000年的闰年

int main()
{
        int year;
        int count = 0;
        for (year = 1000; year <= 2000;year++)
        {
               //判断year是否为闰年
               //1、能被4整除,不能被100整除是闰年
               //2、能被四百整除是闰年
               /*if (year % 4 == 0 && year % 100 != 0)
               {
                       printf("%d ", year);
                       count++;
               }
               else if (year % 400 == 0)
               {
                       printf("%d\n", year);
                       count++;
               }*/
               if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
               {
                       printf("%d\n", year);
                       count++;
               }
        }
        printf("%d\n", count);
}
//函数形式
int is_leap_year(int n)
{       
        if ((n % 4 == 0 && n % 100 != 0) || n % 400 == 0)
               return 1;
        else
               return 0;
}
int main()
{
        int year;
        for (year = 1000; year <= 2000; year++)
        {
               if (is_leap_year(year==1));
               printf("%d\n", year);
        }
}

12、打印100-200之间的素数

int main()
{
        int i = 0;
        int count = 0;
        for (i = 100; i <= 200; i++)
        {
               //判断i是否为素数
               //1.试除法
               //产生2->i-1
               int j = 0;
               for (j = 2; j < i; j++)
               {
                       if (i % j == 0)
                       {
                              break;
                       }
               }
               if (j == i)
               {
                       count++;
                       printf("%d\n", i);
               }
        }
        printf("%d\n", count);
}
//i=a*b a和b中至少有一个数字<=开平方i
#include<math.h>
int main()
{
        int i = 0;
        int count = 0;
        for (i = 101; i <= 200; i+=2)//偶数一定不是素数,跳过所有偶数
        {
               int j = 0;
               for (j = 2; j <= sqrt(i); j++)//开平方
               {
                       if (i % j == 0)
                       {
                              break;
                       }
               }
               if (j > sqrt(i))
               {
                       count++;
                       printf("%d\n", i);
               }
        }
        printf("%d\n", count);
}
//函数形式 是素数返回1,不是素数返回0
int is_prime(int n)
{
        int j = 0;
        for (j = 2; j < n; j++)
        {
               if (n % j == 0)
               {
                       return 0;
               }
        }
        return 1;
}
int main()
{
        int i = 0;
        for (i = 100; i <= 200; i++)
        {
               //判断i是否为素数
               if (is_prime(i) == 1)
                       printf("%d\n", i);
        }
}

13、逆序打印字符串

int my_strlen(char* arr)
{
    int count = 0;
    while (*arr != '\0')
    {
        count++;
        arr++;
    }
    return count;
}
void reverse_string(char* str)//指针传参 
//{
//    assert(str);
//    int len = my_strlen(str);
//    char* left = str;
//    char* right = str + len - 1;
//    while (left<right)
//    {
//        int tmp = *left;
//        *left = *right;
//        *right= tmp;
//        left++;
//        right--;
//    }
//}


//void reverse_string(char arr[])//数组传参
//{
//    int left = 0;
//    int right = my_strlen(arr) - 1;
//    while (left<right)
//    {
//        int tmp = arr[left];
//        arr[left] = arr[right];
//        arr[right] = tmp;
//        left++;
//        right--;
//    }
//}
void reverse_string(char* arr)//递归形式
{
    char tmp = arr[0];
    int len = my_strlen(arr);
    arr[0] = arr[len - 1];
    arr[len - 1] = '\0';
    if (my_strlen(arr + 1) >= 2)
    {
        reverse_string(arr + 1);
    }
    arr[len - 1] = tmp;
}
int main()
{
    char arr[] = "abcdef";
    reverse_string(arr);
    printf("%s\n", arr);
}

14、输入一个非负整数,返回组成它的数字之和

int DigitSum(unsigned int num)//递归
{
    if (num > 9)
    {
        return DigitSum(num / 10) + num % 10;
    }
    else
    {
        return num;
    }
}
int main()
{
    unsigned int num = 0;
    scanf("%d", &num);
    int ret = DigitSum(num);
    printf("ret=%d\n", ret);
}

15、递归实现n的k次方

double Pow(int n, int k)
{
    if (k < 0)
        return(1.0 / (Pow(n, -k)));
    else if (k ==0)
        return 1;//停止
    else
        return n*Pow(n,k-1);
}
int main()
{
    int n = 0;
    int k = 0;
    scanf("%d %d", &n,&k);
    double ret = Pow(n, k);
    printf("ret=%.2lf\n", ret);
}

16、五个人,每个选手说对一半,判断排名
A说:B第二,我第三
B说:我第二,E第四
C说:我第一,D第二
D说:C最后,我第三
E说:我第四,A第一

int main()
{
    int a, b, c, d, e = 0;
    for (a = 1; a <= 5; a++)
    {
        for (b = 1; b <= 5; b++)
        {
            for (c = 1; c <= 5; c++)
            {
                for (d = 1; d <= 5; d++)
                {
                    for (e = 1; e <= 5; e++)
                    {
                        if (((b==2)+(a==3)==1) && ((b == 2) + (e == 4)==1) && ((c == 1) + (d == 2)==1) && ((c == 5) + (d == 3)==1) && ((e == 4) + (a == 1)==1))
                        {
                            if (a * b* c* d* e == 120)
                            {
                                printf("a=%d b=%d c=%d d=%d e=%d\n", a, b, c, d, e);
                            }
                        }
                    }
                }
            }
        }
    }
}

在这里插入图片描述

17、汽水问题 一瓶汽水一元,两个空瓶换一个汽水,问能喝几瓶

int main()
{
    int money = 0;
    int total = 0;
    int empty = 0;
    scanf("%d", &money);
    //买回来的汽水
    total = money;
    empty = money;
    //换回来的汽水
    while (empty >= 2)
    {
        total += empty / 2;
        empty = empty / 2 + empty % 2;
    }
    printf("total=%d\n", total);
}
//将数组的奇数放到前面,偶数放到后面
//从左边开始找一个偶数
//从右边开始找一个奇数
//把它们交换

void move(int arr[], int sz)
{
    int left = 0;
    int right = sz - 1;
   
    while (left <= right)
    {
        //从左边找偶数
        while ((left <= right)&&arr[left] % 2 == 1)
        {
            left++;
        }
        //从右边找奇数
        while ((left <= right) && arr[right] % 2 == 0)
        {
            right--;
        }
        if (left < right)
        {
            int tmp = arr[left];
            arr[left] = arr[right];
            arr[right] = tmp;
        }
    }
}
void print(int arr[], int sz)
{
    int i = 0;
    for (i = 0; i < sz; i++)
    {
        printf("%d ", arr[i]);
    }
}
int main()
{
    int arr[] = { 2,4 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    move(arr, sz);
    print(arr, sz);
}

18、求Sn=a+aa+aaa+aaaa+aaaaa前五项和

int main()
{
        int n = 0;
        int a = 0;
        int i = 0;
        int sum = 0;
        int ret = 0;
        scanf("%d %d", &a, &n);
        //2 22 222 2222 2222     前一项*10+2
        for (i = 0; i < n; i++)
        {
               ret = ret * 10 + 2;//求出每一项的数
               sum += ret;//相加
        }
        printf("%d\n", sum);
}

19、水仙花(自幂数) n位数,每位数的n次方之和等于这个数

#include<math.h>
int main()
{
        int i = 0;
        for (i = 0; i <= 100000; i++)
        {
               //判断i是否为水仙花数
               //1.判断i的位数--n
               int n = 1;
               int tmp = i;
               while (tmp/=10)
               {
                       n++;
               }
               //123/10=12 n++
               //12/10=1 n++
               //1/10=0
               //2.计算i的每一位数的n次方之和 sum
               tmp = i;
               int sum = 0;
               while (tmp)
               {
                       sum+=pow(tmp % 10, n);
                       tmp /= 10;
               }
               //3.比较i和sum
               if (i == sum)
               {
                       printf("%d ", i);
               }
        }
}

20、打印菱形

int main()
{
        int line = 0;
        scanf("%d", &line);
        //打印上半部分
        int i = 0;
        for (i = 0; i < line; i++)
        {
               //打印空格
               int j = 0;
               for (j = 0; j < line - 1 - i; j++)
               {
                       printf(" ");
               }
               //打印*
               for (j = 0; j < 2 * i + 1; j++)
               {
                       printf("*");
               }
               printf("\n");
        }
        //打印下半部分
        for (i = 0; i < line-1; i++)
        {
               //打印空格
               int j = 0;
               for (j = 0; j <=i; j++)
               {
                       printf(" ");
               }
               //打印*
               for (j = 0; j < 2 * (line-1-i) - 1; j++)
               {
                       printf("*");
               }
               printf("\n");
        }
        return 0;
}

21、左旋字符串

//旋转字符串
//1、暴力求解
#include<string.h>
#include<assert.h>
void left_move(char* arr, int k)
{
        assert(arr != NULL);
        int i = 0;
        int len = strlen(arr);
        for (i = 0; i < k; i++)
        {
               //左旋转一个字符
               //1.将第一个字符拿出来
               char tmp = *arr;
               //2.将其余字符分别往前移动一个
               int j = 0;
               for (j = 0; j < len - 1; j++)
               {
                       *(arr + j) = *(arr + j + 1);
               }
               //3.将第一个字符放到最后一个
               *(arr + len - 1) = tmp;
        }
}
int main()
{
        char arr[] = "abcdef";
        left_move(arr,2);
        printf("%s\n", arr);
}
//2、三步翻转法
//ab cdef
//ba fedc
//cdefab
//逆序字符串的函数
void reverse(char* left, char* right)
{
        assert(left != NULL);
        assert(right != NULL);
        while (left < right)
        {
               char tmp = *left;
               *left = *right;
               *right = tmp;
               left++;
               right--;
        }
}
void left_move(char* arr, int k)
{
        int len = strlen(arr);
        assert(arr);
        assert(k <= len);
        reverse(arr, arr + k - 1);
        reverse(arr + k, arr + len - 1);
        reverse(arr, arr + len - 1);
}
int main()
{
        char arr[] = "abcdef";
        left_move(arr, 3);
        printf("%s\n", arr);
}

22、判断字符串是否为左旋之后的字符串

int is_left_move(char* s1, char* s2)
{
        int len = strlen(s1);
        int i = 0;
        for (i = 0; i < len; i++)
        {
               left_move(s1, 1);//穷举旋转后的所有字符串
               int ret = strcmp(s1, s2);//比较
               if (ret == 0)
                       return 1;
        }
        return 0;
}
int main()
{
        char arr1[] = "abcdef";
        char arr2[] = "cdefba";
        int ret = is_left_move(arr1, arr2);
        if (ret == 1)
               printf("Yes\n");
        else
               printf("No\n");
}
int is_left_move(char* str1, char* str2)
{
        int len1 = strlen(str1);
        int len2 = strlen(str2);
        if (len1 != len2)
               return 0;
        //1.在str1字符串中追加一个str1字符串
        //strcat(str1,str1)//err
        strncat(str1,str1,len1);
        //2.判断str2指向的字符串是否是str1指向的字符串的子串
        char* ret = strstr(str1, str2);//在str1中找str2,若找到返回str2的地址,找不到返回空指针
        if (ret == NULL)
        {
               return 0;
        }
        else
        {
               return 1;
        }
}
int main()
{
        char arr1[30] = "abcdef";
        char arr2[] = "cdefab";
        int ret = is_left_move(arr1, arr2);
        if (ret == 1)
               printf("Yes\n");
        else
               printf("No\n");
}

23、杨氏矩阵 每一行从左到右依次增加,每一列从左到右依次增加
找右上角 一行里面最大的,一列里面最小的 //找左下角
一行里面最小的,一列里面最大的

int FindNum(int arr[3][3], int k, int*px, int*py)
{
        int x = 0;
        int y = *py - 1;
        while (x <= *px - 1 && y >= 0)
        {
               if (arr[x][y] > k)
               {
                       y--;
               }
               else if (arr[x][y] < k)
               {
                       x++;
               }
               else
               {
                       *px = x;
                       *py = y;
                       return 1;
               }
        }
        return 0;
}
int main()
{
        int arr[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
        int k = 7;
        int x = 3;
        int y = 3;
        //返回型参数
        int ret = FindNum(arr, k, &x, &y);
        if (ret == 1)
        {
               printf("找到了\n");
               printf("下标是%d %d\n", x, y);
        }
        else
        {
               printf("找不到\n");
        }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值