您现在的位置是:首页 > 伤感句子

C语言 100道经典编程题适用于专升本,专接本【详细分析版】

作者:淼淼时间:2024-03-27 15:05:38分类:伤感句子

简介  文章浏览阅读4w次,点赞286次,收藏1.7k次。本篇涵盖C语言100道常见的编程题,适用于“专接本,专升本,考研,期中期末考试”,每道题都是亲自手动打出来的,也在编译器上测试过,每道题都有相关的详细注释,如有发现错误,欢迎评论区指正。对于零基础伙伴或者没咋做

点击全文阅读

文章目录

🎉前言⭐️1.十进制数转任意进制数⭐️2.数字三角形⭐️3. 编程求某年第 n 天的日期。⭐️求周岁⭐️5.编程求出使该算式成立时的这两个数,⭐️6.功能:(较难不用看) 编程求任意给两个日期(年 月 日)相差的天数。⭐️7.把一个数的二进制奇数位和偶数位交换⭐️8.题目要求找出数组中的两个单身狗⭐️9. 数字字符串转换为整数⭐️10.升序的数组插入一个数,还保持升序⭐️11.输入年 月 判断该月多少天⭐️12 遍历法求名次⭐️13. 谁是凶手⭐️14.输入一个整数数组,实现一个函数,来调整数组中的奇数和偶数的位置,奇数在前偶数在后⭐️15.1元一瓶汽水,两个空瓶可以换一瓶,问20元可以喝多少瓶⭐️16.打印一个菱形,输如n的打印2*n - 1行的菱形⭐️17.输入一个整数找出紧跟在他后面的素数⭐️18.计数求和,Sn=2+22+222+2222+22222⭐️19.输入两个数求最小公倍数和最大公因数,代码中有详解⭐️20.一个数 +100之后是完全平方数,+168还是一个完全平方数⭐️21 .数字金字塔⭐️22.字符串左旋⭐️23.【稍难不用看】要求:写一个函数判断一个字符串是否是另一个字符串旋转后得到的⭐️24.给数组删除重复的元素⭐️25.C语言编程题求1! + 2! + 3! + 4!..... + N!⭐️26.C语言编程题求斐波那契数(循环法与递归法)⭐️27.C语言编程输入n,k求n的k次幂(递归与非递归)⭐️28.(递归)输入一个数,把他的每一位相加在输出出来;⭐️29.实现函数把字符数组的元素逆序 如“abc“, 逆序成“cba“.⭐️30. 递归拆分整数⭐️31.设计以函数打印乘法口诀表,⭐️32.构造一函数判断是否为素数100-200之间(只能被自己和1整除的数)⭐️33.打印二进制数的奇数位和偶数位;分别打印二进制序列⭐️34.计算M和N二进制中不同的位数,例如 1和7 有两位不同;⭐️35.输出1900到2000之间的所有闰年⭐️36. 猴子吃桃问题⭐️37.选择排序法 升序排列⭐️38.冒泡排序法⭐️39.求3*3矩阵对角元素的和⭐️40.把整数数组中的元素值逆序存放⭐️41.杨辉三角形⭐️42.折半查找---必须建立在有序的数组中⭐️43. 计算3行 80个字符 的类型个数⭐️44. 原文与密码⭐️45.模拟strcat字符串连接函数⭐️46.模拟strlen(3种方法)⭐️47.模拟strcmp⭐️48.模拟字符串拷贝函数strcpy⭐️49.strncpy的模拟⭐️50.strncat模拟实现⭐️51.模拟strncmp⭐️52.(较难些可以不看)模拟寻找子串的函数strstr⭐️53.内存拷贝函数⭐️54.判断一个数是不是素数:⭐️55.3*3矩阵的转置⭐️56.任何比 2 大的偶数, 总能表示两个素数,⭐️57.输入四位数字输出四个字符⭐️58.把a数组的内容拷贝到b数组每拷贝三个放1个*⭐️59.输入一串字符串把其中最长的字母拷贝放到另一个数组⭐️60.16进制转换位10进制⭐️61.输入10个整数,最大的和最后一个位置上的交换,最小的和最前面的那个交换⭐️62.报数问题 n个人 从1报数到3,每次报数到3的那个元素被清空⭐️63.输入多个字符串,排序后输出⭐️64.(难可不看)输入一个字符串,将连续的数字字符串放到另一个二维数组中⭐️65.结构体指针问题⭐️66.三天打鱼两天晒网, 第 N 天是打鱼还是晒网?⭐️67.输入多个字符串, 然后输出最短的字符串⭐️68. 3 个数, 有两个数一样, 找另一个数⭐️69.有 1000 人捐款, 捐到 10 万就停止捐款。 统计捐款人数和总额⭐️70.指定位置字符串逆序⭐️71.水仙花数⭐️72.求素数因子⭐️73.判断一个数是不是完全平方数?⭐️74.蠕虫问题⭐️75.结构体排序学生情况⭐️76.求一元二次方程的根, ax 方+bx + c = 0, a, b, c 自己输入⭐️77.累加100--999之间个位数为7的素数⭐️78.斐波那契兔子⭐️78.迭代求平方根⭐️79.累加二维数组边缘元素的和⭐️80.逗号表达式方面小题⭐️81.白马百担问题⭐️82.八进制转10进制⭐️83.func(func(x++, y++), func(--x, --y));函数调用问题⭐️84.水手分桃子⭐️85.挖素数⭐️86.两个有序递增 的数组存到另一个数组还是有序的⭐️87.把字符串中的空格去掉⭐️88.将b字符串的内容插入到a字符串,a字符串保持升序⭐️89.用递归的方法把字符串逆序⭐️90.分解质因数⭐️91.10进制转16进制⭐️92.10进制转8进制⭐️93.计算并输出n以内10个最大素数的和⭐️94.完数⭐️95.打印X型图案⭐️96.打印空心正方形⭐️97.判断一个数组是否有序⭐️98.整形数组删除指定的数字⭐️99.给字符数组每个元素中间添加一个空格⭐️100.旋转字符⭐️101.求sinx近似值

🎉前言

🎉欢迎关注🔎点赞👍收藏⭐️留言📝
🎉推荐up主专题文章【C语言编程一百题】

🍭作者水平很有限,如果发现错误,请及时告知作者哦!感谢感谢!

本篇涵盖C语言100道常见的编程题,适用于“专接本,专升本,考研,期中期末考试”,每道题都是亲自手动打出来的,也在编译器上测试过,每道题都有相关的详细注释,如有发现错误,欢迎评论区指正。对于零基础伙伴或者没咋做过编程题的小伙伴真心希望将这篇文章的每道题至少【做三遍】,没有人做一遍就能全部都学会,我自己在做编程题时也是做了好几遍,做完之后过一段时间可能也会忘,这就说明还是不熟,就像打王者荣耀时,你不可能上去就会玩的很好,如果你有英雄联盟基础肯定是稍微熟悉一下王者就可以很快上手,其实做这些题也是,锻炼的是一种意识,意识就熟能生巧,很喜欢韩顺平老师课上提到的一句话:“我亦无他,唯手熟尔”,其实也没什么,就是手熟罢了!记住哦!多做几遍,这些题应付接本,升本,绰绰有余。加油,铁铁!

⭐️1.十进制数转任意进制数

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int main(){int i = 0, j = 0, num[20], base, n = 0;char ch[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9','A', 'B', 'C', 'D', 'E', 'F' };printf("请输入一个数:");scanf("%d", &n);printf("请输入要转换的进制数:");scanf("%d", &base);do{//255 转16 // (1) 255%16=15 15放入num[0]  255/15=15  //(2) 15%16=15   15放入num[1]  15/16=0 n==0 退出 15正是char数组元素 F 的下标num[i] = n%base;//n%base得出来的余数最大不会大于base n = n / base;i++;} while (n != 0);//最先的余数是在最后面打印//--i 因为在里面多加了一次for (j = --i; j >= 0; j--){printf("%c", ch[num[j]]);}return 0;}

在这里插入图片描述

⭐️2.数字三角形

⭐️本题需要看图代数去试:

​#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int main(){int i, j, k,t=0;for (i = 1; i <= 9; i++){t = 0;//第一次是8个空格while (8 - i >= t){//打印空格t++;printf("  ");}for (j = 1; j <= i; j++)//打印左半边三角形printf("% d", j);for (k = i - 1; k > 0; k--)//打印右半边三角形printf("% d", k);printf("\n");}return 0;}​

在这里插入图片描述

⭐️3. 编程求某年第 n 天的日期。

⭐️用数组表示月天数。

int main(){int year, days, month = 0;int a[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };printf("请输入年,天数:");scanf("%d%d", &year, &days);int t = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);//判断闰年while (days > 0 && days < 365 + t){//<=0跳出days -= a[month];//总天数减去每个月份的天数month++;}if (days < 0){//若是days<0了 月份-1 在天数上加回来 days 加这个月的天数          //2022  50天  50天-1月=19天  19-28天 =-9  month=2  month-1=1            //1是a[1] days=-9  -9+28 =19  也就是2月19日month--;days += a[month];//最后一次的时候天数不够减 days为负数了要加回来,变为每月的多少号}//month也是代表数组下标 0开始printf("%d-%d-%d \n", year, month + 1, days);return 0;}

在这里插入图片描述

⭐️求周岁

⭐️4.功能: 输入一个学生的生日(年: y0、 月: m0、 日: d0), 并输入当前日期(年: y1、 月: m1、 日: d1)。 求出该学生的年龄(实足年龄)

    int main()    {    int age, y0, y1, m0, m1, d0, d1;    printf("输入生日日期(年,月,日) ");    /***********SPACE***********/    scanf("%d%d%d", &y0, &m0, &d0);    printf("输入当前日期(年,月,日)");    scanf("%d%d%d", &y1, &m1, &d1);    age = y1 - y0;    /***********SPACE***********/    if (m0>m1)age--;//生日月份大于当前月份 2000 12 31     2022 6 2       /***********SPACE***********/    if ((m0 == m1) && (d0>d1))age--; //两个月份相等的情况下 生日日期大于当前日期 age--    printf("age=%3d", age);    return 0;    } ```

⭐️5.编程求出使该算式成立时的这两个数,

⭐️5.功能: 算式: (空)2 * 7(空) = 3848 中缺少一个十位数和一个个位数编程求出使该算式成立时的这两个数, 并输出正确的算式。

    //功能: 算式: (空)2 * 7(空) = 3848 中缺少一个十位数和一个个位数。    //编程求出使该算式成立时的这两个数, 并输出正确的算式。         int main(){    int m, n;    for (m = 1; m <= 9; m++){    for (n = 0; n <= 9; n++){    if ((10 * m + 2)*(7 * 10 + n) == 3848){    printf("%d*%d", 10 * m + 2, 70 + n);    }    }    }    return 0;    }

⭐️6.功能:(较难不用看) 编程求任意给两个日期(年 月 日)相差的天数。

//功能: 编程求任意给两个日期(年 月 日)相差的天数。void date(int startyear, int startmonth, int startday, int endyear,int endmonth, int endday){int arr[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };int flagmonth_sta, flagmonth_end, i, j,total=0;for (i = startyear; i <= endyear; i++){if (i == startyear)//开始年的月,按从开始的月计算flagmonth_sta = startmonth;else flagmonth_sta = 1;//否则在1月开始 if (i == endyear)//若是末尾年月份在末尾月结束flagmonth_end = endmonth;else flagmonth_end = 12;//否则就在12结束 //累加这一年月份的日子for (j = flagmonth_sta; j <= flagmonth_end; j++){ //判断是不是闰年if (flagmonth_end > 2 && (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)){arr[2] = 29;}else arr[2] = 28; int start_day, end_day;if (startmonth == j&&i==startyear)//是起始年的起始月start_day = startday;else start_day = 0;//否则天数是0 if (endmonth == j&&i == endyear)//终止年的终止月 设为传过来得天数end_day = endday;else end_day = arr[j];//否则是数组的天数 //;累加当前月份的日子for (int n = start_day; n <= end_day; n++){total++;} } }printf("%d", total-1);} int main(){int startyear, startmonth, startday;int endyear, endmonth, endday;printf("请输入开始的年月日:");scanf("%d%d%d", &startyear, &startmonth, &startday);printf("请输入终止的年月日:");scanf("%d%d%d", &endyear, &endmonth, &endday);date(startyear, startmonth, startday, endyear, endmonth, endday);  return 0;}

⭐️7.把一个数的二进制奇数位和偶数位交换

    //写一个函数把一个数的二进制奇数位和偶数位交换    void Print(int num){    int arr[32],count=0;        while (num){    arr[count++]=num % 2;    num /= 2;    }    for (int i = count-1; i >= 0; i--)    printf("%d ", arr[i]);    printf("\n");    }    int  Swap(int num){    return ((num & 0xaaaaaaaa) >> 1) + ((num & 0x55555555) << 1);    }    int main(){    int num = 0;    printf("请输入一个数:");    scanf("%d", &num);    printf("初始二进制位:\n");    Print(num);    int result=Swap(num);    printf("Swap后十进制 = %d \n Swap后二进制位:\n",result);    Print(result);         return 0;    }

在这里插入图片描述

在这里插入图片描述

⭐️8.题目要求找出数组中的两个单身狗

⭐️即数组中只有x个元素是单独不一样的,别的都是有相同的兄弟

    //题目要求找出数组中的两个单身狗,即数组中只有x个元素是单独不一样的,    //别的都是有相同的兄弟    int main(){    int arr[10] = { 1, 2, 5, 4, 9, 0, 1, 2, 3, 4 };    int flag;    //10个数循环比较10次     for (int i = 0; i < 10; i++){    flag = 0;    //每个擂主要和全部的人比较,包括自己    for (int j = 0; j < 10; j++){    if (arr[i] == arr[j]){    flag++;//会和自己本身比较一下,所以找到单身狗flag=1 不是的大于1    }    }    if (flag <= 1)printf("单身狗= %d\n", arr[i]);    }    return 0;    }

在这里插入图片描述

⭐️9. 数字字符串转换为整数

    //数字字符串转换为整数    int isNumber(char a[]){    //-123    int i = 0, flag = 0;    if (a[0] == '-'){    //判断是不是数字字符    for ( i = 1; a[i] != '\0'; i++){    if (!(a[i] >= '0'&&a[i] <= '9'))    break;    }    if (a[i] == '\0')    flag = -1;    //若是判断是负数的数字字符返回-1    }    else {//不是负数数字字符的情况    for (i = 0; a[i] != '\0'; i++){    if (!(a[i] >= '0'&&a[i] <= '9'))    break;    }    if (a[i] == '\0')    flag = 1;//若是正数数字字符满足条件返回1         }    return flag;//0的情况是不是合法字符         }    void str_num(char a[]){    int i = 0,num=0,flag=1;//整数的符号    int start=-1;//判断字符串转换的起始位置    //判断是不是数字字符串    int flag11=isNumber(a);    if (flag11 == 0){    printf("不是合法数字字符\n");    return;    }    else if (flag11 == -1){//负数数字字符串转换为整数    flag = -1;    start = 1;    }    else if (flag11 == 1){    flag = 1;    start = 0;    }    //转化    for (i = start; a[i] != '\0'; i++){    num = num * 10 + a[i] - '0';    }    num *= flag;    printf("转换为的整数字符是:%d\n", num);         }    int main(){    char a[10];    printf("请输入一个字符串:");    gets(a);    str_num(a);    return 0;    }

在这里插入图片描述

⭐️10.升序的数组插入一个数,还保持升序

    //升序的数组插入一个数,还保持升序    void insert(int a[], int n,int sz){    int i = 0;    for (i = sz - 2; i >= 0; i--){    if (n < a[i]){//n小于数组的元素,该元素向后挪    a[i + 1] = a[i];    }    else {//否则就插入    a[i + 1] = n;    break;    }    }    //插入的数比数组元素都小的情况    if (i == -1)    a[0] = n;                }    int main(){    int a[11] = { 1, 2, 3, 4, 5, 6, 7, 8, 10, 12 };    int sz = sizeof(a) / sizeof(a[0]);    int n = 0;    printf("请输入一个数字:");    scanf("%d", &n);    insert(a, n,sz);    for (int i = 0; i < 11; i++){    printf("%d ", a[i]);    }    return 0;    }

在这里插入图片描述

⭐️11.输入年 月 判断该月多少天

    //输入年 月 判断该月多少天    #include<stdio.h>    int main(){    int y = 0;    int m = 0;//天数固定设计一个数组    int arr[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };    while (scanf("%d %d", &y, &m) != EOF){//ctrl+Z退出    int day = arr[m];//不要对arr[m]直接修改会改动数组内容    if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0){    if (m == 2)    day += 1;    }    printf("%d\n", day);    }    return 0;    }

⭐️12 遍历法求名次

在这里插入图片描述

    int main(){    int a = 0;    int b = 0;    int c = 0;    int d = 0;    int e = 0;    for (a = 0; a <= 5; a++){    for (b = 0; b <= 5; b++){    for (c = 0; c <= 5; c++){    for (d = 0; d <= 5; d++){    for (e = 0; e <= 5; e++){    //他们每个人说的对一半,逻辑值相加才等于1    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)//并且5个人的排名不能相同    printf("a=%d,b=%d,c=%d,d=%d,e=%d\n", a, b, c, d, e);        }    }    }    }    }    }    return 0;    }

在这里插入图片描述

⭐️13. 谁是凶手

在这里插入图片描述

    int main(){    char murder;    for (murder = 'A'; murder <= 'D'; murder++){    //遍历这四个人,且要满足这4个条件    if ((murder != 'A') + (murder == 'C') + (murder == 'D') + (murder != 'D')    ==3){//这四个条件里面3个真的一个假的,所以相加后的逻辑值 ==3才行    printf("murder是  %c\n", murder);    }    }    return 0;    }

⭐️14.输入一个整数数组,实现一个函数,来调整数组中的奇数和偶数的位置,奇数在前偶数在后

    //法1     void reverse(int a[], int sz, int temp1[], int temp2[]){    int j_num = 0, o_num=0, i;    for (i = 0; i < sz; i++){    if (a[i] % 2 == 0){//存到偶数暂存数组    temp1[o_num++] = a[i];    }    else if (a[i] % 2 != 0){    temp2[j_num++] = a[i];    }    }    for (i = 0; i < j_num; i++){//所有奇数放回去    a[i] = temp2[i];    }    for (int j=0; j < o_num; j++,i++){//所有偶数放回去    a[i] = temp1[j];//j来控制偶数数组下标    }         }    int main(){    int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };    int temp1[10];//暂存奇数偶数的数组    int temp2[10];    int sz = sizeof(a) / sizeof(a[0]);    reverse(a, sz,temp1,temp2);    for (int i = 0; i < sz; i++){    printf("%d ", a[i]);    }    return 0;    }

⭐️法2:

//法2void reverse(int left[], int right[]){//left指向起始  right指向数组末尾while (left < right){while ((left<right)&&*left % 2 != 0){left++;//如果*left是奇数就循环接着向后指,直到指向偶数就退出}//(left<right)是避免全是奇数的情况,指导最后一个元素,在向后指就越界了while ((right>left)&&*right % 2 == 0){right--;//如果*right是偶数就循环接着向前指,直到指向奇数就退出} //左边的偶数和右边的奇数交换if (left < right){int temp = *left;*left = *right;*right = temp;}}}int main(){int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int sz = sizeof(a) / sizeof(a[0]);reverse(a, a+sz-1);for (int i = 0; i < sz; i++){printf("%d ", a[i]);}return 0;}

在这里插入图片描述

⭐️15.1元一瓶汽水,两个空瓶可以换一瓶,问20元可以喝多少瓶

    int main(){    int total = 0, empty = 0, money;    printf("请输入钱数:");    scanf("%d", &money);    total = money;//初始瓶子数    empty = money;//空瓶数    while (empty >= 2){//大于等于2才能换    total += empty / 2;//两瓶换一瓶换的累加到总和上去    empty = empty / 2 + empty % 2;//更新空瓶数量有奇数瓶的要加上    }    printf("能喝 %d 瓶\n", total);    return 0;    }

⭐️16.打印一个菱形,输如n的打印2*n - 1行的菱形

    //打印一个菱形,输如n的打印2*n - 1行的菱形         int main(){    int n = 0;    printf("请输入一个数字:");    scanf("%d", &n);    int i, j;    for (i = 0; i < n; i++){//打印上三角    //打印空格    for (j = 0; j < n - 1 - i; j++){    printf(" ");    }    //打印*    for (j = 0; j <= 2 * i; j++){    printf("*");    }    printf("\n");    }    //打印下三角    for (i = 0; i < n - 1; i++){    //打印空格    for (j = 0; j <= i; j++){    printf(" ");    }    //打印*    for (j = 0; j <= 2 * n - 4 - 2 * i; j++){    printf("*");    }    printf("\n");    }    return 0;    }

在这里插入图片描述

⭐️17.输入一个整数找出紧跟在他后面的素数

    //输入一个整数找出紧跟在他后面的素数    int find(int n){    int i;    while (n){    for ( i = 2; i < n; i++){    if (n%i == 0){    break;    }    }    if (n == i)return n;    n++;    }    printf("输入不合法");    return -1;    }    int  main(){    int n = 0;    printf("请输入一个大于1的数:");    scanf("%d", &n);    printf("紧跟的素数是:%d", find(n));    return 0;    }

在这里插入图片描述

⭐️18.计数求和,Sn=2+22+222+2222+22222

    int main(){    int a = 0, total = 0, n = 0, temp = 0;    printf("请输入一个数:a\n");    scanf("%d", &a);    printf("请输入这个数的幂次:n\n");    scanf("%d", &n);         while (n){    //第一次 0*10+2=2   第二次 2*10+2=22  .......    temp = temp * 10 + a;    //累加    total += temp;    n--;//次数-1    }    printf("%d",  total);    return 0;    }

⭐️19.输入两个数求最小公倍数和最大公因数,代码中有详解

⭐️法1:

    ///输入两个数求最小公倍数和最大公因数,代码中有详解    //法1         int main(){    int n, m;    printf("请输入两个数:");    scanf("%d%d", &n, &m);    if (m < n){//m存大数,n存小数    m = m^n;    n = n^m;    m = n^m;    }    int p = m*n;        int i;    for ( i = n; i >= 1; i--){    //两个数的因子最多不会超过小数n,所以从n开始向下试    //并且要满足这个条件    if (m%i == 0 && n%i==0){    printf("最大公因数=%d\n", i);    break;    }    }    printf("最小公倍数就是两数的积除以最大公约数=%d", p / i);         return 0;    }

⭐️法2:

    //法2         int main(){    int n, m;    printf("请输入两个数:");    scanf("%d%d", &n, &m);    if (m < n){//m存大数,n存小数    m = m^n;    n = n^m;    m = n^m;    }    int p = m*n;        int r = 0;    while (n){    r = m%n;    m = n;    n = r;    }         printf("最大公约数是:%d, 最小公倍数是:%d\n", m, p / m);    return 0;    }

⭐️递归版

//递归方法求最大公约数int fun(int m, int n){if (n == 0)return m;else {int r = m%n;m = n;n = r;return fun(m, n);}}int main(){int m, n;printf("请输入两个数:\n");scanf("%d%d", &m, &n);if (m < n){int t = m;m = n;n = t;}printf("最大公约数是:%d\n", fun(m, n));return 0;}

⭐️20.一个数 +100之后是完全平方数,+168还是一个完全平方数

         //一个数 +100之后是完全平方数,+168还是一个完全平方数     //2*2=4 3*3=9 就是完全平方数    #include<math.h>    int main(){    int n = 1, t = 0, k = 0,m=0,k1;    while (n){        k1 = sqrt(n+100);//返回一个double 放int 直接取整了    k = sqrt(n+168);    if (k*k == n+168&&k1*k1==n+100){    printf("%d",n);    break;    }    n++;    }    return 0;    }

在这里插入图片描述

⭐️21 .数字金字塔

    //数字金字塔    int main(){    int n = 0;    printf("请输入一个数:");    scanf("%d", &n);    int i = 0, j = 0;    //打印三角    for (i = 0; i < n; i++){    //打印空格    for (j = 0; j < n - 1 - i; j++)    printf(" ");    //打印*    for (j = 0; j <= 2*i; j++){    printf("%d", n);    }    printf("\n");    }    return 0;    }

在这里插入图片描述

⭐️22.字符串左旋

⭐️实现一个函数,可以左旋字符中的K个字符 例如:ABCD左旋一个字符变成BCDA ABCD左旋两个字符变成CDAB

//字符串左旋//实现一个函数,可以左旋字符中的K个字符//例如://ABCD左旋一个字符变成BCDA//ABCD左旋两个字符变成CDABvoid reverse(char a[], char n){int end=strlen(a) - 1,i;//end指向最后一个char temp;while (n){temp = a[end];//把最后一个挪到temp暂存//从倒数第2个开始向前挪for (i = end - 1; i >= 0; i--){a[i + 1] = a[i];}//挪完把temp的字符放到a[0]a[0] = temp;n--;}}int main(){char a[20];printf("请输入一个字符串:");gets(a);int n = 0;printf("请输入一个左旋的数字:");scanf("%d", &n);reverse(a,n);printf("%s\n", a);return 0;}

在这里插入图片描述

⭐️23.【稍难不用看】要求:写一个函数判断一个字符串是否是另一个字符串旋转后得到的

⭐️ 例如:ABCDE与EDCBA这俩个显然是abcd与ABCD 这显然不是

    //要求:写一个函数判断一个字符串是否是另一个字符串旋转后得到的    //例如:ABCDE与EDCBA这俩个显然是    //abcd与ABCD 这显然不是    #include<string.h>    int judge_string(char* str1, char* str2){    int i, j = 0;    int len = strlen(str1);    //循环字符串长度次    for (i = 0; i < len; i++){    //先比较两个字符串是不是相等    if (strcmp(str1, str2) == 0)    return 1;         //不相等,挪1位在判断是不是相等    char endchar = str1[strlen(str1)-1];    //从倒数第2个开始向前挪    for (j = strlen(str1) - 2; j >= 0; j-- ){    str1[j + 1] = str1[j];    }    str1[0] = endchar;    //接着循环比较挪完1位的是不是相同了    }    return 0;    }    int main(){    char arr1[10] = "ABCDEF";    char arr2[10] = "CDEFAB";    int ret = judge_string(arr1, arr2);//返回1 说明是,返回0 不是    if (ret == 1){    printf("yes");    }    else printf("no");    return 0;    }

在这里插入图片描述

⭐️24.给数组删除重复的元素

    //给数组删除重复的元素    #include<stdio.h>    #define N 12    int main(){    int a[N] = { 1, 1, 2, 3, 3, 4, 6, 4, 8, 6,9,8};    int i = 0, j = 0, n = N;    //n个数比较n-1次    printf("==========去重之前=========\n");    for (i = 0; i < n; i++){    printf("%d ", a[i]);    }    for (i = 0; i < n - 1; i++){         for (j = i + 1; j < n; j++){    if (a[i] == a[j]){    //i位置上的数和后面的比较要是相同,依次向前挪    for (int k = j; k < n - 1; k++){    a[k] = a[k + 1];    }    --n;//把一个数字给干掉了所以n--;    --j;//从j+1后面的位置一直依次向钱挪 j位置被换了新值,所以--j还要再次看    //当前j位置的数与前面的重复嘛    }        }    }    printf("\n==========去重之后=========\n");    for (i = 0; i < n; i++){    printf("%d ", a[i]);    }    return 0;    }

在这里插入图片描述

注意n–了之后,循环的访问范围就减少一个,所以被挪一个减少一个访问范围

⭐️25.C语言编程题求1! + 2! + 3! + 4!… + N!

//C语言编程题————求1! + 2! + 3! + 4!..... + N!int main(){int total = 0, t = 1, i = 0;int n;printf("请输入一个数:");scanf("%d", &n);for (i = 1; i <=n; i++){t *= i;//累乘 第一次 1! 第二次 2! printf("%d的阶乘 : %d\n", i,t);total += t;//累加阶乘}printf("总和 %d! :%d\n", n, total);return 0;}

在这里插入图片描述

⭐️26.C语言编程题求斐波那契数(循环法与递归法)

⭐️递归法

//法1 递归法int fib(int n){if (n > 2){return fib(n - 1) + fib(n - 2);}else return 1;}int main(){int n = 0;printf("您要得到第几个菲薄纳妾数:");scanf("%d", &n);printf("%d\n", fib(n));return 0;}

⭐️普通的方法

//斐波那契数列 1,1,2,3,5,8,13,21 前面的两个数的和是后面这个数int fib1(int n){int a = 1, b = 1, c = 1;//a是前2个数 b是前1个数  while (n > 2){c = a + b;//(1) 1+1=2  (2) 1+2=3a = b;// (1) a=1       (2) a=2 前一个数等于后一个数b = c;// (1) b=2       (2) b=3 算出的C就是下次循环要相加的后一个数n--;}return c;// 第1位 第2位 都是 1}int main(){int n = 0;printf("您要得到第几个菲薄纳妾数:");scanf("%d", &n);printf("%d\n", fib1(n));return 0;}

⭐️数组的方法:

//数组法int main(){int a[500];int n = 0;printf("请输入一个数n:\n");scanf("%d", &n);int i;a[0] = 1, a[1] = 1;for (i = 2; i <=n; i++){a[i] = a[i - 1] + a[i - 2];//前1个数+前2个数=当前数//也就是为数组赋值}printf("打印前n个斐波那契数===============\n");for (i =0 ; i <=n; i++){printf("%6d ", a[i]);//每行打印5个if ((i + 1) % 5 == 0)printf("\n");}return 0;}

在这里插入图片描述

⭐️27.C语言编程输入n,k求n的k次幂(递归与非递归)

⭐️递归法:

//C语言编程————输入n,k,求n的k次幂(用递归的方法)int fun(int n, int k){if (k <1)return 1;//0次幂都是1else return n*fun(n, k - 1);//否则 n*多次调用fun}int main(){int n, k;printf("请输入(n,k):");scanf("%d%d", &n,&k);printf("%d", fun(n, k));return 0;}

递归过程图:

在这里插入图片描述

⭐️非递归法:

//C语言编程————输入n,k,求n的k次幂(非递归的方法)int fun(int n, int k){int total = 1;while (k--){total *= n;}return total;}int main(){int n, k;printf("请输入(n,k):");scanf("%d%d", &n,&k);printf("%d", fun(n, k));return 0;}

⭐️28.(递归)输入一个数,把他的每一位相加在输出出来;

⭐️如1234 1 + 2 + 3 + 4 = 10

//用函数实现输入一个数,把他的每一位相加在输出出来;如1234 1 + 2 + 3 + 4 = 10int deal(int num){if (num > 9)return num % 10 + deal(num / 10);//大于9 就先%10 得到余数 在加 deal(num/10)若小于10 单一一个数直接返回这个数else return num;}int main(){int num = 0;printf("请输入一个数:");scanf("%d", &num);printf("%d各位相加之后的和是:%d\n", num, deal(num));return 0;}

在这里插入图片描述

⭐️29.实现函数把字符数组的元素逆序 如“abc“, 逆序成“cba“.

⭐️非递归版

//实现函数把字符数组的元素逆序 如“abc“, 逆序成“cba“.void reverse(char a[]){int start = 0, end = strlen(a) - 1;//-1为了不去挪'\0'while (start < end){//首尾交换 直到start和end都指向同一个或者start>end时候结束交换char temp = a[start];a[start] = a[end];a[end] = temp;start++;//向后指end--;//向前指}}int main(){char a[20];printf("请输入一个字符串:");gets(a);reverse(a);printf("逆序之后:%s\n", a);return 0;}

⭐️递归版:

void reverse(char a[]){char temp = a[0];//进来之后先把当前数组的首元素赋值到临时变量int len = strlen(a) - 1;//指向最后一个元素a[0] = a[len];//把最后一个元素给第一个元素空间a[len] = '\0';//把最后一个元素赋值'\0'if (len >= 2){//若是字符串长度大于2就要交换reverse(a + 1);//再次调用 向前指一个}//完成递归之后 把在栈中的每个temp返回放到当前a[len]中a[len] = temp;}int main(){char a[20];printf("请输入一个字符串:");gets(a);reverse(a);printf("逆序之后:%s\n", a);return 0;}

在这里插入图片描述

⭐️30. 递归拆分整数

//递归拆分整数void deal(int n){if (n > 9)deal(n / 10);printf("%d ", n % 10);}int main(){int num = 0;printf("请输入一个数:\n");scanf("%d", &num);deal(num);return 0;}

在这里插入图片描述

⭐️31.设计以函数打印乘法口诀表,

⭐️输入9,是99乘法表,输入8是88乘法表

//设计以函数打印乘法口诀表,输入9,是99乘法表,输入8是88乘法表void Print1(int n){int i = 0, j = 0;for (i = 1; i <= n; i++){for (j = 1; j <= i; j++){printf("%d*%d=%3d", i, j, i*j);}printf("\n");}}int main(){int num = 0;printf("请输入一个数:");scanf("%d", &num);Print1(num);return 0;}

在这里插入图片描述

⭐️32.构造一函数判断是否为素数100-200之间(只能被自己和1整除的数)

//素数100 - 200之间(只能被自己和1整除的数)int main(){int i = 0;for (i = 100; i <= 200; i++){int j;for (j = 2; j < i; j++){if (i%j == 0)break;}if (i == j)printf("%4d", i);}return 0;}

在这里插入图片描述

⭐️33.打印二进制数的奇数位和偶数位;分别打印二进制序列

//打印二进制数的奇数位和偶数位;分别打印二进制序列void Print_two(int n){int i;printf("打印奇数位:\n");//右移0位是第一个二进制 所以右移 30位其实是第31个二进制位for (i = 30; i>=0; i-=2){printf("%d ", (1 & (n >> i)));}printf("\n打印偶数位:\n");//右移1位是第二个二进制 所以右移 31位其实是第32个二进制位for (i = 31; i >= 0; i -= 2){printf("%d ", (1 & (n >> i)));}}int main(){int n = 0;printf("请输入一个数字:");scanf("%d", &n);Print_two(n);return 0;}

在这里插入图片描述

⭐️34.计算M和N二进制中不同的位数,例如 1和7 有两位不同;

//计算M和N二进制中不同的位数,例如 1和7 有两位不同;int main(){int n, m;printf("请输入2个数:");scanf("%d%d", &n, &m);int t = m^n;//通过二进制亦或后,相同为0不同为1,故此t里面1的个数就代表n和m之间有几个二进制位//不同//求出t里面有多少个1int count = 0, i = 0;while (i < 32){//移位32次 移了31位//右移1位与1==1就说明当前二进制位是1if (t >> i & 1 == 1){count++;}i++;}printf("二进制位不同有%d位\n", count);return 0;}

在这里插入图片描述

⭐️35.输出1900到2000之间的所有闰年

//输出1900到2000之间的所有闰年int main(){for (int i= 1900; i <= 2000; i++){//世纪闰年 必须是400的倍数if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0 )){printf("%d是闰年  ",i);}}}//润年分为世纪闰年和普通润年  //普通闰年是  能整除4就行   为啥还要加%100不等于0呢  排除不是世纪闰年的 比如1900 不是闰年//整百数的世纪闰年是   能整除400就行

⭐️36. 猴子吃桃问题

⭐️有一群猴子,去摘了一堆桃子*商量之后决定每天吃剩余桃子的一半当每天大家吃完桃子之后,有个贪心的小猴都会偷偷再吃一个桃子按照这样的方式猴子们每天都快乐的吃着桃子直到第十天,当大家再想吃桃子时,发现只剩下一个桃子问:猴子们一共摘了多少桃子

当前天吃前一天的一半零一个 .prvday/2+1=curday ---->(curday+1)*2=prvday
前一天/2+1=当前天的数量

/*有一群猴子,去摘了一堆桃子*//*商量之后决定每天吃剩余桃子的一半*//*当每天大家吃完桃子之后,有个贪心的小猴都会偷偷再吃一个桃子*//*按照这样的方式猴子们每天都快乐的吃着桃子*//*直到第十天,当大家再想吃桃子时,发现只剩下一个桃子了*///问:猴子们一共摘了多少桃子//当前天吃前一天的一半零一个   //prvday/2+1=curday  ---->(curday+1)*2=prvday//前一天/2+1=当前天的数量  int main(){int curday = 1, prvday = 0;int days = 9;while (days > 0){//第一次循环 算出第一次前一天的数量prvday = (curday + 1) * 2;curday = prvday;//前一天的数量在给到当前天 接着循环days--;}printf("猴子摘了%d个桃子\n", curday);return 0;}

⭐️37.选择排序法 升序排列

在这里插入图片描述

Print_(int *a,int sz){printf("打印数组情况===============\n");for (int i = 0; i < sz; i++){printf("%d ", a[i]);}printf("\n");}//选择排序法 升序排列int main(){int a[10] = { 1, 4, 7, 2, 5, 8, 3, 6, 9, 0 };int i, j, index;int sz = sizeof(a) / sizeof(a[0]);//10个数循环比较9次就行for (i = 0; i < sz - 1; i++){index = i;//index看为擂主for (j = i + 1; j < sz; j++){//index和j下标的打擂台,让index指向最小的数if (a[index] >a[j])index = j;}if (index != i){//把最小的数放到i下标的位置int t = a[index];a[index] = a[i];a[i] = t;}}Print_(a,sz);return 0;}

⭐️38.冒泡排序法

⭐️比较相邻的元素。如果第一个比第二个大,就交换他们两个。

对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

针对所有的元素重复以上的步骤,除了最后一个。

持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定性算法。

冒泡排序基础的排序算法,也是我们必须要牢牢掌握的一种算法。

//冒泡排序法int main(){int a[10] = { 1, 4, 7, 2, 5, 8, 3, 6, 9, 0 };int i, j;int sz = sizeof(a) / sizeof(a[0]);//10个数循环比较9次就行for (i = 0; i < sz - 1; i++){for (j = 0; j < sz - 1 - i; j++){//从0号下标开始和后面的比较,若是当前j号大于j+1号就交换//第1轮把最大的放到最后,所以j < sz - 1 - i  减i为了//之前挪到后面的较大数不在发生没必要的比较if (a[j]>a[j + 1]){int t = a[j];a[j] = a[j + 1];a[j + 1] = t;}}}Print_(a, sz);return 0;}

在这里插入图片描述

⭐️39.求3*3矩阵对角元素的和

//求3*3矩阵对角元素的和int main(){int total = 0, a[3][3] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 };int i,j;//主对角for (i = 0; i < 3; i++){total += a[i][i];}//副对角for (i = 0, j = 2; i < 3; i++, j--){if (i != j){total += a[i][j];}}printf("total=%d\n", total);return 0;}

⭐️40.把整数数组中的元素值逆序存放

//把整数数组中的元素值逆序存放int main(){int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int left=0, right = sizeof(a) / sizeof(a[0])-1;while (left < right){int t = a[left];a[left] = a[right];a[right] = t;left++;right--;}Print_(a, 10);//打印函数return 0;}

在这里插入图片描述

⭐️41.杨辉三角形

//杨辉三角形//int main(){////利用二维数组//int a[10][10];//for (int i = 0; i < 10; i++){//循环10次//for (int j = 0; j <= i; j++){//if (0 == j || i == j){//a[i][j] = 1;//对角线元素和0列赋值//}//else{//其余元素赋值//a[i][j] = a[i - 1][j] + a[i - 1][j - 1];//}//}//}//for (int i = 0; i < 10; i++){//for (int j = 0; j <= i; j++){//printf("%4d", a[i][j]);//}//printf("\n");//}//return 0;//}

在这里插入图片描述

⭐️42.折半查找—必须建立在有序的数组中

//折半查找---必须建立在有序的数组中int main(){int a[11] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,11 };//left指向第一个  right指向最后一个int left = 0, right = sizeof(a) / sizeof(a[0])-1;int n,mid=right;//第一次指向最后一个printf("请输入要查找得数:");scanf("%d", &n);while (left < right){if (a[mid] < n){//中间元素<n 说明当前左边的全小于nleft = mid;//所以left等于mid}else if (a[mid]>n){//中间元素>n 说明当前右边的全大于nright = mid;//所以right等于mid}else {printf("找到了 下标是%d\n", mid);break;}mid = (left + right) / 2;//在除以2改变循环条件}if (left >= right)printf("没有找到该元素\n");return 0;}

在这里插入图片描述

⭐️43. 计算3行 80个字符 的类型个数

// 计算3行  80个字符 的类型个数int main(){char ch[3][80];int i = 0;//输入3行字符//for (i = 0; i < 3; i++){//gets(ch[i]);//scanf遇到空格或者换行就结束了//}int max_sum = 0, min_sum = 0, number_sum = 0, speace_sum = 0, other_sum = 0;for (i = 0; i < 3; i++){gets(ch[i]);for (int j = 0; ch[i][j] != '\0'; j++){if (ch[i][j]>='a'&&ch[i][j]<= 'z')min_sum++;else if (ch[i][j]>='A'&&ch[i][j] <= 'Z')max_sum++;else if (ch[i][j]>='0'&&ch[i][j] <= '9')number_sum++;else if (ch[i][j]==' ')speace_sum++;else other_sum++;}}printf("小写字母:%d\n大写字母:%d\n数字数量:%d\n空格数量:%d\n其它字符数量:%d\n", min_sum, max_sum,\number_sum,speace_sum, other_sum);return 0;}

⭐️44. 原文与密码

⭐️输入A转换为Z B<–>Y c<–>X 以此类推

//原文与密码  输入A转换为Z B<-->Y   c<-->X  以此类推int main(){char a[30];printf("请输入一串字母:\n");gets(a);int i = 0;while (a[i]){if (a[i] >= 'a'&&a[i] <= 'z'){a[i] = 'a' + 25-(a[i] - 'a');//基值'a' +25-(差值)  a[i] 若是'a'  a[i]-'a'=0  'a'+25+0=z}if (a[i] >= 'A'&&a[i] <= 'Z'){a[i] = 'A' + 25-(a[i] - 'A');//基值'a' +25-(差值)  a[i] 若是'a'  a[i]-'a'=0  'a'+25+0=z}i++;}printf("转换之后:%s\n", a);return 0;}

在这里插入图片描述

⭐️45.模拟strcat字符串连接函数

//模拟strcat字符串连接函数void My_strcat(char *str1, char *str2){while (*str1)str1++;//先让str1指向'\0'while (*str1 = *str2){//把当前str2指向的字符赋值给str1指向的空间                  //结束条件是*str1指向的空间被赋值了'\0'str1++, str2++;//两个指针变量分别向后指}}int main(){char str1[20];char str2[20];printf("请输入两个字符串:");gets(str1);gets(str2);My_strcat(str1, str2);printf("连接之后:%s\n", str1);return 0;}

在这里插入图片描述

⭐️46.模拟strlen(3种方法)

⭐️方法1:计数器法

//模拟strlen//方法1 普通式int My_strlen(char *a){//abcint count = 0;while (*a != '\0'){//不是'\0'  count就加1count++;a++;}return count;}int main(){char a[30];printf("请输入一个字符串:");gets(a);printf("字符串的长度是:%d\n", My_strlen(a));return 0; }

⭐️方法2:指针减指针法

//方法2 指针减指针法int My_strlen2(char *a){//abcint *start = a;//字符串的首地址先暂存到一个指针变量里面去while (*a != '\0')a++;//在让a指向'\0'return a - start;//指针减指针代表指针之间经历的元素个数}int main(){char a[30];printf("请输入一个字符串:");gets(a);printf("字符串的长度是:%d\n", My_strlen2(a));return 0; }

⭐️方法3:递归方法(图解)

int My_strlen3(char *a){//abcif (*a == '\0')return 0;return 1 + My_strlen3(a + 1);}int main(){char a[30];printf("请输入一个字符串:");gets(a);printf("字符串的长度是:%d\n", My_strlen3(a));return 0; }

在这里插入图片描述

⭐️47.模拟strcmp

//模拟strcmp--两个字符串完全相等就返回0 不相等就返回*a-*b的差值int My_strcmp(char *a, char *b){while (*a == *b){//对应下标数的字符相等就循环if (*a == '\0')return 0;//若是有一个等于'\0'说明这两串相等a++, b++;//++比较下一位}return *a - *b;//不满足循环就返回差值}int main(){char a[30], b[30];printf("请输入2个字符串:");gets(a);gets(b);int flag = My_strcmp(a, b);if (!flag)printf("两个字符串是相等的--返回%d\n",flag);else printf("两个字符串是不相等的--返回%d\n",flag);return 0; }

在这里插入图片描述

⭐️48.模拟字符串拷贝函数strcpy

//模拟字符串拷贝函数void My_strcpy(char *a, char *b){while (*a++ = *b++);//先用后加 先用*a的空  和*b的内容 换句话说就是//把*b的内容放到*a的空间中  然后a在++ b在++}int main(){char a[20], b[20];printf("请输入一个字符串:");gets(b);//b字符串拷贝到a数组My_strcpy(a, b);printf("拷贝到a数组之后:%s", a);return 0;}

在这里插入图片描述

⭐️49.strncpy的模拟

⭐️拷贝给定的个数,若是输入的k大于b字符串长度,直接拷贝b字符串全部

//strncpy的模拟  拷贝给定的个数,若是输入的k大于b字符串长度,直接拷贝b字符串全部void My_strncpy(char *a, char *b, int k){while (k&&(*a=*b)){//进来先判断k值 若是0退出  或者*b赋值*a之后*a是'\0'了也退出a++, b++;//两个指针变量指向下一个字符k--;//拷贝的个数减1}if (*a != '\0')*a = '\0';//若拷贝了k个b数组还没有拷贝完  也就是从k=0这个条件退出的//*a不是'\0'要把'\0'拷贝过去}int main(){char a[20], b[20];printf("请输入一个字符串:\n");gets(b);//b字符串拷贝到a数组int k = 0;printf("请输入拷贝的个数:\n");scanf("%d", &k);My_strncpy(a, b, k);printf("拷贝到a数组之后:%s\n", a);return 0;}

在这里插入图片描述

⭐️50.strncat模拟实现

在字符串str1后面追加给定的k个字符 思路就别strncpy多一步 先找到str1的’\0’在追加

//strncat模拟实现 //在字符串str1后面追加给定的k个字符  思路就别strncpy多一步  先找到str1的'\0'在追加void My_strncat(char *str1, char *str2, int k){while (*str1)str1++;//指向'\0'while (k && (*str1 = *str2)){//进来先判断k值 若是0退出  或者*str2赋值*str1之后*str1是'\0'了也退出                     //两个指针变量指向下一个字符str1++, str2++;//向后指k--;//个数-1}if (*str1 != '\0')*str1 = '\0';//若拷贝了k个str2数组还没有拷贝完  也就是从k=0这个条件退出的////*str1不是'\0'要把'\0'拷贝过去}int main(){char str1[20];char str2[20];int k = 0;printf("请输入两个字符串:");gets(str1);gets(str2);printf("请输入一个数:\n");scanf("%d", &k);My_strncat(str1, str2,k);printf("连接之后:%s\n", str1);return 0;}

在这里插入图片描述

⭐️51.模拟strncmp

⭐️比较两个字符串的前n个字符是不是相等

int My_strncmp(char *a, char*b, int k){int t = k;while (k&&*a == *b){if (*a == '\0'){printf("两个字符串都遇到的'\0' 相同 \n\n");return 0;}a++, b++;//指向下一个字符k--;//个数--}if (k == 0){//若是在k=0时退出 说明前k个字符相等printf("前%d个字符是相同的退出\n\n", t);return 0; }else return *a - *b;//否则while循环是因为两个字符串不相等退出的返回差值}int main(){char a[30], b[30];int k;printf("请输入两个字符串:\n");gets(a);gets(b);printf("请输入一个数K:\n");scanf("%d", &k);int flag = My_strncmp(a, b,k);if (!flag)printf("两个字符串是相等的--返回: %d\n", flag);else printf("两个字符串是不相等的--返回: %d\n", flag);return 0;}

在这里插入图片描述

⭐️52.(较难些可以不看)模拟寻找子串的函数strstr

在这里插入图片描述
在这里插入图片描述

//模拟寻找子串的函数strstrchar * My_strstr(char *a, char *b){if (*b =='\0')return a;//如果b数组是空数组直接返回a数组名char *na = NULL;//内层指针char *nb = NULL;//内层指针while (*a){na = a;//na每次指向下一个nb = b;//每次nb指向b串的第一个元素while (*nb == *na&&*na != '\0'&&*nb != '\0'){nb++, na++;//元素相等++}//如果*nb=='\0'说明上面循环nb指向'\0'前面几个元素是相等的if (*nb == '\0')return a;a++;}//a指向'\0'说明a不存在子串if (*a == '\0')return NULL;}int main(){char a[20];//abcdefchar b[20];//abcdefj     查找a数组里面有没有bcdprintf("请输入2个字符串:");gets(a);gets(b);char *c=My_strstr(a, b);if (c != NULL)printf("找的了:%s\n", c);else printf("没有找的子串\n");return 0;}

⭐️53.内存拷贝函数

⭐️memcpy(src,dest,size);size代表拷贝的字节数

//内存拷贝函数memcpy(src,dest,size);size代表拷贝的字节数void My_memcpy(void *a, void *b, int sz){char *src = (char*)a;//转化为char*可以对一个字节处理char *dest = (char*)b;while (sz){*src = *dest;src++, dest++;//向后指一的字节sz--;//拷贝的字节数-1}}int main(){int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int b[10] = { 0 };My_memcpy(b,a,20);//20字节 int 占4字节  也就是5个元素for (int i = 0; i < 10; i++)printf("%d ", b[i]);return 0;}

在这里插入图片描述

⭐️54.判断一个数是不是素数:

//判断一个数是不是素数:void fun(int n){int i = 0;for (i = 2; i < n; i++){if (n%i == 0){printf("不是素数...");return;}}if (i == n)printf("是素数...");}int main(){int n = 0;printf("请输入一个数:\n");scanf("%d", &n);fun(n);return 0;}

在这里插入图片描述

⭐️55.3*3矩阵的转置

//3*3矩阵的转置void Print(int a[][3]){int i = 0, j = 0;for (i = 0; i < 3; i++){for (j = 0; j < 3; j++){printf("%d ", a[i][j]);}printf("\n");}printf("\n");}int main(){int a[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };int i = 0, j = 0;printf("转置之前=============\n");Print(a);//转置for (i = 0; i < 3; i++){for (j = 0; j < i; j++){int t = a[i][j];a[i][j] = a[j][i];a[j][i] = t;}}printf("转置之后=============\n");Print(a);return 0;}

在这里插入图片描述

⭐️56.任何比 2 大的偶数, 总能表示两个素数,

⭐️比如 24=5+19; 5 和 19 都是素数

⭐️解释:在这里插入图片描述

int fun_(int n){int i = 0;for (i = 2; i < n; i++){if (n%i == 0)return 0;}if (i == n)return n;}int main(){int n = 0;do{printf("请输入一个偶数:");scanf("%d", &n);} while (n % 2 != 0);int t = 2, m = n - 2;//必须是-2//例如 1,2,3,4,5,6// 1,2,3,4,5,6,7,8//1,2,3,4,5,6,7,8,9,10//左边从2开始  右边从n-2开始while (t < n&&m >= 2){if (fun_(t) && fun_(m)){//两个全是素数才行printf("%d+%d=%d", t, m, n);break;}t++, m--;//--再试}return 0;}

⭐️57.输入四位数字输出四个字符

⭐️解释:在这里插入图片描述

//输入四位数字输出四个字符//void Switch_(int num){//if (num >= 10)Switch_(num / 10);//printf("%c ", num % 10 + '0');//}//int main(){//int num = 0;//printf("请输入一个数字:\n");//scanf("%d", &num);//Switch_(num);//return 0;//}

在这里插入图片描述

⭐️58.把a数组的内容拷贝到b数组每拷贝三个放1个*

⭐️法1:

//把a数组的内容拷贝到b数组每拷贝三个放1个*int main(){char a[30];char  b[30] = { 0 };int i = 0, j = 0;//j控制b数组下标printf("请输入一个字符串:");gets(a);for (i = 0; a[i] != '\0'; i++){b[j++] = a[i];//直接拷贝元素if ((i + 1) % 3 == 0){b[j++] = '*';//拷贝三个就加一个*}}printf("%s", b);return 0;}

⭐️法2:

//把a数组的内容拷贝到b数组每拷贝三个放1个*int main(){char a[30];char  b[30] = { 0 };int i = 0, j = 0;//j控制b数组下标printf("请输入一个字符串:");gets(a);char *p = a;while (*p){//拷贝3个或者*p=='\0'是结束for (i = 1; i <= 3 && *p != '\0'; i++, p++)b[j++] = *p;//拷贝p所指向的字符串中的字符if (*p!='\0')b[j++] = '*';//放一个*}printf("拷贝之后: %s\n", b);}

在这里插入图片描述

⭐️59.输入一串字符串把其中最长的字母拷贝放到另一个数组

#include<string.h>void FindWord(char *a, char *b){//"1abc22hello";char *na = a;while (*a){na = a;//让na指针变量去改变while (*na >= 'a'&&*na <= 'z' || *na >= 'A'&&*na <= 'Z'){na++;//向后指一个}//退出条件:是非字母字符就退出int flag = na - a;//指针-指针代表指针之间经历的元素个数int len = strlen(b);//获得字符串b的长度if (flag > len){strncpy(b, a, flag);}if (*na == '\0')break;//最大单词在最后 na指向了'\0' 下面的else a = na + 1;//就跳过去了,所以在这判断一下if (na == a)a++;//没有进while就外层指针+1else a = na + 1;//否则就进了,+1是因为while退出时指向了非字母字符要跳过去}}int main(){char a[256] = "1abc22hello";char b[256] = { 0 };//存最大单词;printf("请输入一个字符串:");gets(a);FindWord(a, b);//找的最长的单词放到b数组printf("最长的单词是: %s\n", b);return 0;}

在这里插入图片描述

⭐️60.16进制转换位10进制

//16进制转换位10进制void deal(char *a){int num = 0, i;for (i = 0; a[i]; i++){if (a[i] > '0'&&a[i] <= '9'){num = num * 16 + a[i] - '0';//公式记住就可}else if (a[i] >= 'a'&&a[i] <= 'f'){num = num * 16 + a[i] - 'a' + 10;}}printf("转换为十进制为:%d\n", num);}int main(){char a[9];printf("请输入一个16进制数:\n");gets(a);deal(a);return 0;}

在这里插入图片描述

⭐️61.输入10个整数,最大的和最后一个位置上的交换,最小的和最前面的那个交换

//输入10个整数,最大的和最后一个位置上的交换,最小的和最前面的那个交换写三个函数void  deal(int *a, int sz){int i,max = 0, min = 0;//默认最大数和最小数在a[0]//思路:1.首先找到最大数下标和最小数下标//2.把最小数和a[0]交换 最大数和a[9]交换  //3.注意 先换交换  可能出现a[0]存的是最大数  你和最小数交换完之后//最大数的下标max要指向先前的最小数下标minfor (i = 0; i < sz; i++){if (a[max] < a[i])max = i;//max总是指向大数if (a[min]>a[i])min = i;//min总是指向小数}int temp=0;if (a[0] == a[max]){//先换交换  可能出现a[0]存的是最大数temp = a[0];//把最小数放到a[0]a[0] = a[min];a[min] = temp;max = min;//a[0]存的最大数挪到了min位置  所以max=min}else {temp = a[0];//把最小数放到a[0]a[0] = a[min];a[min] = temp;}//把最大数放到最后temp = a[sz - 1];a[sz - 1] = a[max];a[max] = temp;}int main(){int a[10] = { 9, 1, 2, 3, 0, 5, 6, 7, 6, 8 };printf("=========交换之前==========\n");for (int i = 0; i < 10; i++){printf("%d ", a[i]);}int sz = sizeof(a) / sizeof(a[0]);deal(a, sz);printf("\n=========交换之后==========\n");for (int i = 0; i < 10; i++){printf("%d ", a[i]);}return 0;}

⭐️思路:
1.首先找到最大数下标和最小数下标
2.把最小数和a[0]交换 最大数和a[9]交换
3.注意 先换交换 可能出现a[0]存的是最大数 你和最小数交换完之后最大数的下标max要指向先前的最小数下标min

在这里插入图片描述

⭐️62.报数问题 n个人 从1报数到3,每次报数到3的那个元素被清空

//报数问题 n个人 从1报数到3,每次报数到3的那个元素被清空int main(){int a[300], n, i=0, j=0, k=0;/*思路:1.为数组赋值n个数2.结束条件是tt==n-1也就是 淘汰掉了n-1个还剩一个人3.a数组元素不为0 报数+14.k==3报到3踢人  淘汰的人数+1 k=0 重新开始  5.报完一轮  存活的还大于1 从新开始*/printf("请输入一个数:\n");scanf("%d",&n);for (i = 0; i < n; i++){a[i] = i + 1;}i = 0;int tt = 0;//淘汰的人数while (n - 1 > tt){//结束条件是tt==n-1也就是 淘汰掉了n-1个还剩一个人if (a[i] != 0){k++;//数组元素不为0 报数+1if (k == 3){a[i] = 0;//设置为0 表示踢出k = 0;//从新开始报tt++;//淘汰的数+1}}i++;if (i == n)i = 0;//报完一轮 从新开始}for (i = 0; i < n; i++){if (a[i] != 0)printf("幸存者:a[%d]\n", i);}return 0;}

⭐️思路:
1.为数组赋值n个数
2.结束条件是 tt == n-1也就是 淘汰掉了n-1个还剩一个人
3.a数组元素不为0 报数+1
4.k==3报到3踢人 淘汰的人数+1 k=0 重新开始
5.报完一轮 存活的还大于1 从新开始

在这里插入图片描述

在这里插入图片描述

⭐️63.输入多个字符串,排序后输出

void sort(char str[5][10]){int i = 0, j = 0;char temp[10];for (i = 0; i < 4; i++){for (j = 0; j < 5 - 1 - i; j++){//升序冒泡排序if (strcmp(str[j], str[j + 1])>0){strcpy(temp, str[j]);strcpy(str[j], str[j+1]);strcpy(str[j+1], temp);}}}}//输入多个字符串,排序后输出int main(){char str[5][10] = { "bbbbb", "aaaaa", "ccccc", "fffff", "eeeee" };printf("=========排序之前========\n");for (int i = 0; i < 5; i++){printf("%s\n", str[i]);}sort(str);printf("\n=========排序之后========\n");for (int i = 0; i < 5; i++){printf("%s\n", str[i]);}return 0;}

在这里插入图片描述

⭐️64.(难可不看)输入一个字符串,将连续的数字字符串放到另一个二维数组中

//输入一个字符串,将连续的数字字符串放到另一个二维数组中int Find_number(char a[], char ch[][20]){//a1265bb1234/*思路:1.外层用*a指针变量来控制循环2.定义char *na 在内层变化找一段数字字符3.判断是不是连续的 4.找到了就拷贝到ch数组  用一个变量控制ch数组下标 */char *na = a, row=0;while (*a){na = a;//让na去改变while (*na >= '0'&&*na <= '9'){na++;//指向非数字字符的结束}if (na == a)a++;else {//否则就指向了数字字符 判断na-a之间经历的这几个数字字符是不是连续的char *temp = a,flag=0;//flag=1 拷贝//判断是不是升序连续的             //na-1避免temp+1等于na for (temp; temp < na-1; temp++){//解释 前一个+1不等于后一个数那么就不是升序连续if ((*temp+1)!= *(temp + 1))break;}if (temp == na - 1){//说明是升序连续flag = 1;}else {//否则判断是不是降序连续temp = a;//从新赋值for (temp; temp < na - 1; temp++){//解释 前一个-1不等于后一个数那么就不是降序连续if ((*temp - 1) != *(temp + 1))break;}    if (temp == na - 1)flag = 1;//说明是降序连续}if (flag == 1){//完成拷贝功能//na-a指针-指针代表指针之间经历的元素个数strncpy(ch[row++], a, na - a);}if (na == '\0')break;//如果na指向了'\0'就不用下面赋值了a = na + 1;//na指向的是非数字字符 +1指向下一个没判断的 赋给a    }//else_end}//while_endreturn row;//返回个数}int main(){char a[100];char ch[10][20] = { 0 };printf("请输入一串字符内包含连续数字:\n");gets(a);int row=Find_number(a, ch);printf("提取出来的数字字符串是:\n");for (int i = 0; i <row; i++){printf("串%d: %s\n",i+1, ch[i]);}return 0;}

⭐️思路:
1.外层用a指针变量来控制循环
2.定义char na 在内层变化找一段数字字符
3.判断是不是连续的
4.找到了就拷贝到ch数组 用一个变量控制ch数组下标

在这里插入图片描述

⭐️65.结构体指针问题

在这里插入图片描述

⭐️66.三天打鱼两天晒网, 第 N 天是打鱼还是晒网?

//三天打鱼两天晒网, 第 N 天是打鱼还是晒网?int main(){int days = 0;printf("请输入天数:\n");scanf("%d", &days);//123打鱼 45晒网    也就是%5==0就是晒网  14 15 19 20  都在晒网if (days % 5 == 0 || (days+1) % 5 == 0)printf("在晒网...");else printf("在打鱼...\n");return 0;}

在这里插入图片描述

⭐️67.输入多个字符串, 然后输出最短的字符串

//输入多个字符串, 然后输出最短的字符串。void Find_minlen(char a[][20]){int len = strlen(a[0]);//设第一个字符串最短int flag = 0;for (int i = 1; i < 3; i++){if (len>strlen(a[i])){//a[i]短就进入iflen = strlen(a[i]);//把短的这串的长度给lenflag = i;//存最短字符串的下标}}printf("最短第字符串是:%s \n", a[flag]);}int main(){char a[3][20] = {"abxc","abc","hello"};Find_minlen(a);return 0;}

在这里插入图片描述

⭐️68. 3 个数, 有两个数一样, 找另一个数

//三个球, 大小一样, 其中有一个质量和其他球质量不同, 请找出//不同的球。 也就是 3 个数, 有两个数一样, 找另一个数int main(){int a[3] = { 1, 1, 3};int sz = sizeof(a) / sizeof(a[0]), i, j, count = 0;printf("=======成员情况========\n");for (i = 0; i < sz; i++){printf("%d ", a[i]);}printf("\n");for (i = 0; i < sz; i++){count = 0;//记录相同的个数 2个数一样 count=2 //j=0 从0开始遍历for (j = 0; j < sz; j++){if (a[i] == a[j])count++;//因为a[i]和a[j]比较时会和相同下标的比较一次也就是count最少就为1}if (count == 1)printf("单身狗是:%d\n", a[i]);}}

在这里插入图片描述

⭐️69.有 1000 人捐款, 捐到 10 万就停止捐款。 统计捐款人数和总额

//有 1000 人捐款, 捐到 10 万就停止捐款。 统计捐款人数和总额int main(){double total_money = 0, money = 0;int person_num = 0;while (total_money < 100000){person_num++;//人数+1printf("请第%d个慈善家捐款:\n",person_num);scanf("%lf", &money);total_money += money;//累加if (person_num >= 1000)break;//人数>=1000退出}if (person_num >= 1000 && total_money < 100000)printf("1000个人没娟够...");else {printf("捐款人数:%d\n善款总金额:%.2lf\n", person_num, total_money);}return 0;}

在这里插入图片描述

⭐️70.指定位置字符串逆序

void reverse(char *s, int index){//index下标之前的字符逆序输出int i = 0;while (i < index){char t = s[i];s[i] = s[index];s[index] = t;i++;index--;}}int find_x(char *s,char x){for (int i = 0; s[i] != '\0'; i++){if (x == s[i])return i;}printf("没有找的返回-1\n");return -1;}int main(){char s[30], x;printf("请输入一个字符串:\n");gets(s);printf("请输入一个字符:\n");x = getchar();int index = find_x(s,x);if (index != -1){reverse(s, index);printf("===逆序之后====\n");printf("%s\n", s);}return 0;}

⭐️在给定的字符串 s寻找一个特定的字符 x,如果找到,返回 x 在 s 的第一次出现的下标,在主函数中把 s 字符串x字符之前的字符逆序输出*

在这里插入图片描述

⭐️71.水仙花数

⭐️一个三位数 各位的立方相加等于该数就是水仙花数

int main(){int i = 0;for (i = 100; i < 1000; i++){int a = i % 10;//获得个位int b = i / 10 % 10;//获得十位int c = i / 100;//获得百位if (a*a*a + b*b*b + c*c*c == i)printf("水仙花数:%d\n", i);}return 0;}

在这里插入图片描述

⭐️72.求素数因子

⭐️给一个数,求它的素数因子。一个数(素数除外),均可由若干素数相乘组成。

//给一个数,求它的素数因子。一个数(素数除外),均可由若干素数相乘组成。int fun_1(int n){int i = 0;for (i = 2; i < n; i++){if (n%i == 0){printf("不是素数需要操作...\n");return 0;}}if (i == n){printf("是素数不用操作...\n");return 1;}}int main(){int n = 0;printf("请输入一个数:\n");scanf("%d", &n);int flag = fun_1(n);if (!flag){int i = 0;for (i = 2; i <=n; i++){while (n % i == 0){printf("%d ", i);n /= 2;}}//printf("%d", i);}return 0;}

在这里插入图片描述

在这里插入图片描述

⭐️73.判断一个数是不是完全平方数?

//编写函数,  功能判定完全平方数, 若一个数能表示成某个数平方形//式, 则为完全平方数  2*2=4  3*3=9#include<math.h>void deal_(int n){int t = (int)sqrt(n);//返回来是一个double的强转为int sqrt(5) 返回来 2.多 t=2  2*2!=5if (t*t == n)printf("%d*%d = %d\n", t, t, n);else printf("不是完全平方数...\n");}int main(){int n = 0;printf("请输入一个数:\n");scanf("%d", &n);deal_(n);return 0;}

在这里插入图片描述

⭐️74.蠕虫问题

⭐️一条蠕虫长 1 寸, 其 1 分钟可以向上爬 U 寸, 但是他得休息, 休息的时候下滑 D 寸, 问什 么时候爬出去? 不足 1 分钟按照 1 分钟计算, 蠕虫头部到达井的顶部, 则完成任务, 开始蠕 虫趴在井底(高度为 0)

int main(){double u, d, js,total=0;int time = 0;printf("请输入上爬u 下滑d 井深js:\n");scanf("%lf%lf%lf", &u, &d, &js);while (total+1 < js){//因为虫子长1cm  试想虫子0cm  累加到100(井深),结束条件是total==100//而我们虫子1cm我们total+1就行了不用算虫子的长度,也就是爬99cm就ok(忽略下滑)total += u;//上爬u寸total -= d;//下滑d寸time++;time++;}total += d;//最后一次退出到顶了,就不用下滑一次了time -= 1;//下滑时间-1printf("%d分钟 ", time);return 0;}

在这里插入图片描述

⭐️75.结构体排序学生情况

⭐️用结构体来描述一个学生的成绩情况, 内容包括: 姓名、 学号、 C 成绩、 微机原理成绩、 对一个班 30 同学统计求同学平均分、 分数从高到低排名, 打印出名字, 打印出 90 以上和不及格的同学名字

//用结构体来描述一个学生的成绩情况, 内容包括: 姓名、 学号、 C 成绩、 微机原理成绩、 对//一个班 30 同学统计。//求同学平均分、 分数从高到低排名, 打印出名字, 打印出 90 以上和不及格的同学名字#define N 3struct student{char name[10];int num;int C;int W;int ave;};void Print(struct student stu[], int n){for (int i = 0; i < n; i++){printf("名字: %s 学号: %d C语言: %d  微原:%d\n ", stu[i].name,stu[i].num, stu[i].C, stu[i].W);}}void Find(struct student stu[], int n){for (int i = 0; i < N; i++){if (stu[i].ave >= 90){printf("大于90的: ");printf("名字: %s 学号: %d C语言: %d  微原:%d\n ", stu[i].name,stu[i].num, stu[i].C, stu[i].W);}else if (stu[i].ave < 60){printf("小于60的: ");printf("名字: %s 学号: %d C语言: %d  微原:%d\n ", stu[i].name,stu[i].num, stu[i].C, stu[i].W);}}}void sort(struct student stu[]){struct student temp;for (int i = 0; i < N; i++){//冒泡排序for (int j = 0; j < N - 1 - i; j++){if (stu[j].ave < stu[j + 1].ave){temp = stu[j];stu[j] = stu[j + 1];stu[j + 1] = temp;}}}Print(stu, N);//打印//找大于90和不及格的  Find(stu, N);}int main(){struct student stu[N], temp;int i = 0;for (i = 0; i < N; i++){printf("请输入第%d个学生的信息:名字学号C   W  :\n",i+1);gets(stu[i].name);scanf("%d%d%d", &stu[i].num, &stu[i].C, &stu[i].W);getchar();int total = stu[i].C + stu[i].W;stu[i].ave = total /2;}sort(stu);return 0;}

在这里插入图片描述

⭐️76.求一元二次方程的根, ax 方+bx + c = 0, a, b, c 自己输入

//思路, 首先判断根与系数的关系//<0 无解//>0 两个不同的解//=0 两个相同的解如果大于等于 0 x1=-b/2a+判别式/2a x2=-b/2a-判别式/2aint main(){double a, b, c, disc, x1, x2, p, q;scanf("%lf%lf%lf", &a, &b, &c);disc = b*b - 4 * a*c;if (disc<0)printf("无根\n");else{p = -b / (2.0*a);q = sqrt(disc) / (2.0*a);x1 = p + q;x2 = p - q;printf("根为:\nx1=%7.2f\nx2=%7.2f\n", x1, x2);}return 0;}

⭐️77.累加100–999之间个位数为7的素数

//设计一个函数  判断是否为素数, 是返回 1, 否返回 0, 在主函数中调用//输出 100 - 999 之间的各位数为 7 的所有素数之和。int fun_2(int n){for (int i = 2; i < n; i++){if (n%i == 0)return 0;}return 1;}int main(){int i = 0,total=0;for (i = 100; i <= 999; i++){if (fun_2(i)&&i%10==7){printf(" %5d \n", i);total += i;}}printf("100--999之间个位数为7的素数和是:%d\n", total);}

在这里插入图片描述

⭐️78.斐波那契兔子

在这里插入图片描述⭐️本质就是求斐波那契数列:

//一对兔子, 从出生后的第 3 个月起, 每个月都要生一对兔子, 小兔子长到 3 个月之后每个月//又生一对兔子, 假如兔子都不死, 请问第一个月出生的一对兔子, 至少繁衍到//几个月时兔子总数才可以达到 N 对?//1 1 2 3  5 8int main(){int month = 1, total = 0, a = 1,b=0;int nums;printf("请输入一个数:");scanf("%d", &nums);//兔子个数if (nums == 1)printf("需要1个月\n");//2月之后的else {while (total < nums){total = a + b;b = a;     //前面1个加前面2个等于当前这个a = total;month++;printf(" %d ", total);}printf("需要%d个月\n", month);}return 0;}

在这里插入图片描述

⭐️78.迭代求平方根

在这里插入图片描述

int main(){double a = 0, x0 = 0, x1 = 0;printf("请输入一个数:\n");scanf("%lf", &a);x1 = a;//先给x1赋个值while (fabs(x0 - x1) > 1e-6){x0 = x1;//x0保存上一次的结果x1 = (x0 + a / x0) / 2;//x1保存新的结果  迭代循环 x1根据x0变化  x1会越变越小}printf("%.2lf的平方根是: %.2lf\n", a, x1);return 0;}

在这里插入图片描述

⭐️79.累加二维数组边缘元素的和

//累加二维数组边缘元素的和void Show(int a[][4], int row, int col){printf("=====数组情况======\n");for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){printf("%d ", a[i][j]);}printf("\n");}}void add(int a[][4], int row, int col){int i = 0, j = 0,total=0;//累加行int n = 2;//总共加最上面一行和最下面一行while (n > 0){for (j = 0; j < col; j++)total += a[i][j];i = row - 1;//最后一行n--;}//累加列n = 2;j = 0;//一次加第0列while (n > 0){for (i = 0; i < row; i++)total += a[i][j];j = col - 1; // 第二次加 最后一列n--;}//累加完之后 四个角上的元素多加了一次 减去total = total - a[0][0] - a[0][col - 1] - a[row - 1][0] - a[row - 1][col - 1];//                a[0][0]  a[0][3]         a[2][0]         a[2][3]Show(a,row,col);printf("总和是:%d\n", total);}int main(){int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 }, s = 0;add(a, 3, 4);return 0;}

在这里插入图片描述

⭐️80.逗号表达式方面小题

在这里插入图片描述
在这里插入图片描述

⭐️81.白马百担问题

⭐️百马百担问题: 有 100 匹马, 驮 100 担货, 大马驮 3 担, 中马驮 2 担, 两匹小马驮 1 担, 问大、 中、 小马各多少匹 ?

int main(){int dm, zm, xm;for (dm = 0; dm <=100; dm++){//大妈xx头和中马最多100-dm头  小马最多100-dm-zm头 循环试for (zm = 0; zm <=100 - dm; zm++){xm = 100 - dm - zm;//等式两边乘以2 dm一个驮3袋if (dm * 6 + zm * 4 + xm == 200){printf("大妈:%d  中妈:%d 小马: %d\n", dm, zm, xm);}}}return 0;}

在这里插入图片描述

⭐️82.八进制转10进制

⭐️以下程序的功能是将无符号八进制数字构成的字符串转换为十进制整数。 例如输入的字符串为“556”, 则输出十进制整数 366。

//以下程序的功能是将无符号八进制数字构成的字符串转换为十进制整数。 例如输入的字符串//为“556”, 则输出十进制整数 366。int main(){char a[9];int num = 0;printf("请输入一个八进制数:\n");scanf("%s", a);char *p = a;//a是数组名,数组名是常数不能++要放到指针变量去while (*p){num = num * 8 + *p - '0';          //公式可以推导一下和之前一道题16进制转10进制差不多p++;}printf("转换为的十进制数是: %d\n", num);return 0;}

在这里插入图片描述

⭐️83.func(func(x++, y++), func(–x, --y));函数调用问题

⭐️VS2013上测试:
在这里插入图片描述

⭐️解释:

在这里插入图片描述

⭐️DEVC++上面测试:

在这里插入图片描述

⭐️84.水手分桃子

⭐️思路: 五个人每人独自醒了一次,把全部的桃子分成5份余1个 拿一份给自己 剩下的四份在合起来成为一个整体在去分,也就是最后每个人各自给你自己分了一份,最后一起醒来把剩下的又分为5份余一个,定义一个数组a[6]

/*思路:五个人每人独自醒了一次,把全部的桃子分分成5份余1个 那一份给自己 剩下的四份在合起来成为一个整体在去分,也就是最后每个人各自给你自己分了一份,最后一起醒来把剩下的又分为5份余一个,定义一个数组a[6]  */int main(){int index = 0, i = 0, num = 0, a[6] = { 0 };while (1){i++;num = i;//让num去试看看是不是要寻找的那个数while (num % 5 == 1){num=(num-1)/ 5;//减去给猴子的一个a[index++]=num;num *= 4;//把剩余的4份组合成一份}if (index == 6)break;//正常退出数组满了分好了if (index != 6)index = 0;//数组下标置为0继续找}for (index = 0; index < 5; index++){printf("第%d个人分了%d个\n", index + 1, a[index] + a[5]);}printf("全部=%d\n", i);//加上了给猴的6个return 0;}

在这里插入图片描述

⭐️85.挖素数

//挖素数打印1-100之间的素数int main(){int a[100],i,j;//给数组赋值for (i = 0; i < 100; i++){a[i] = i + 1;}//a[0] = 0;//a[0]=1 不是素数 挖去for (i = 1; i < 100; i++){if (a[i] == 0)continue;//分母不能为0for (j = i + 1; j < 100; j++){if (a[j] % a[i] == 0 && a[j] != 0){a[j] = 0;}}}//打印for (i = 0; i < 100; i++){if (a[i]!=0)printf("%d ", a[i]);}return 0;}

在这里插入图片描述

⭐️86.两个有序递增 的数组存到另一个数组还是有序的

//两个有序递增 的数组存到另一个数组还是有序的#define N 6#define M 5int main(){int a[N] = { 2, 4, 5, 8, 10, 12 };int b[M] = { 1, 3, 5, 7, 9 };int c[N*M];int ai=0, bi=0, k = 0;while (ai<N&&bi<M){//有一个数组传递完就退出//如果数组1的元素都比数组2小就提前传送完退出//必须有一个是<=否则就会死循环if (a[ai] <=b[bi]){//如果a数组元素小于b数组元素把a数组元素放到C数组c[k++] = a[ai++];}else if (b[bi] < a[ai]){//如果b数组元素小于a数组元素把b数组元素放到C数组c[k++] = b[bi++];}}while(ai != N){//ai下标没有到最大值就把a数组剩余的拷贝过来c[k++] = a[ai++];}while(bi != M){//bi下标没有到最大值就把b数组剩余的拷贝过来c[k++] = b[bi++];}for (int i = 0; i < k; i++){printf("%d ", c[i]);}return 0;}

在这里插入图片描述

⭐️87.把字符串中的空格去掉

//把字符串中的空格去掉int main(){char a[20] = "123 456 789";int i = 0, j = 0;printf("去掉空格之前: %s\n", a);for (i = 0; a[i]; i++){if (a[i] != ' ')a[j++] = a[i];//j也指向a数组用空间,i指向数组a用内容  只有i指向的元素不是空格才赋值}a[j] = '\0';//最后把j下标的赋值'\0'printf("去掉空格之后:%s\n", a);return 0;}

在这里插入图片描述

⭐️88.将b字符串的内容插入到a字符串,a字符串保持升序

//将b字符串的内容插入到a字符串,a字符串保持升序int main(){char a[10] = "bceg";char b[10] = "adf";int i = 0, j = 0;//j控制b数组下标for (j = 0; b[j]; j++){i = strlen(a);a[i + 1] = a[i];//上来先把'\0'向后挪1位for (--i; i >= 0; i--){if (a[i] > b[j]){a[i + 1] = a[i];//如果a[i]的元素大于b[j]那么a[i]向后挪1位}else {//否则b[j]这个元素大于等于a[i],b[j]放到a[i+1](空的)的位置a[i + 1] = b[j];break;}}if (i == -1){//如果a[0]位置的元素都大于b[j]元素那么a[0]挪到a[1]位置,b[j]放到a[0]位置a[i + 1] = b[j];}}printf("操作之后:%s\n", a);return 0;}

在这里插入图片描述

⭐️89.用递归的方法把字符串逆序

//用递归的方法把字符串逆序abcde  转换为edcbavoid reverse_(char *a){char *p = a,ch='\0';while (*p)p++;//指向'\0'p--;//指向'\0'下一个字符if (a < p){//>=就不进ch = *a;//前面这几个字符在存到的临时变量的ch中*a = *p;//把后面的这几个字符放到前面*p = '\0';//*p='\0'下次递归调用*p位置就不会被再次交换reverse_(a + 1);//每次递归返回返回到这*p = ch;//第一次p指向e的位置   第二次递归调用p指向e的位置}}int main(){char a[20] = "abcde";printf("逆序之前:%s\n",a);reverse_(a);printf("逆序之后:%s\n", a);return 0;}

在这里插入图片描述

⭐️90.分解质因数

//分解质因数,若150 分为 1 * 2 * 3 * 5 * 5 负数就是 - 1乘int main(){int n = 0;printf("请输入一个数:\n");scanf("%d", &n);if (n > 0){printf("1");}else if(n<0){printf("-1");}for (int i = 2; i <=n; i++){while (n%i == 0){//第一次%2把2这个质因子都找出来  下一次在找3 不会出现非素数printf("*%d", i);n /= i;}}return 0;}

在这里插入图片描述

⭐️91.10进制转16进制

//10进制转16进制void deal(int n){char a[20] = { 0 };int r = 0,i=0;while (n){r = n % 16;//%16取余n /= 16;if (r >= 10){a[i++] = r + 55; //'A'--65}else {a[i++] = r + '0';//0~9之间直接加'0'}}printf("转换之后:");for (--i; i >= 0; i--){printf("%c", a[i]);}}int main(){int n = 0;printf("请输入一个数:\n");scanf("%d", &n);deal(n);return 0;}

在这里插入图片描述

⭐️92.10进制转8进制

//10进制转8进制void deal(int n){char a[10] = { 0 };int r = 0,i=0;while (n){r = n % 8;//%8取余 r最后不会大于等于8n /= 8;a[i++] = r + '0';}printf("转换之后:");for (--i; i >= 0; i--){printf("%c", a[i]);}}int main(){int n = 0;printf("请输入一个数:\n");scanf("%d", &n);deal(n);return 0;}

在这里插入图片描述

⭐️93.计算并输出n以内10个最大素数的和

//计算并输出n以内10个最大素数的和int oop(int n){int i;for (i = 2; i < n; i++){if (n%i == 0)return 0;}return 1;}int main(){int  n = 0;printf("请输入一个数: ");scanf("%d", &n);int total = 0, t = 0;int count = 0;while (n){     //从n开始向下递减1if (oop(n)){count++;total += n;printf("(%d). %d  ", count, n);}n--;if (count == 10)break;}if (count <= 0){printf("\n输入的%d值太小后面没有10个素数\n", n);}elseprintf("\n和是:%d\n", total);return 0;}

在这里插入图片描述

⭐️94.完数

⭐️如果一个数恰好等于它的真因子之和,则称该数为“完全数”。第一个完全数是6,第二个完全数是28,第三个完全数是496,他的所以因子相加等于他本身这个数就是完数

//如果一个数恰好等于它的真因子之和,则称该数为“完全数”。第一个完全数是6,第二个完全数是28,第三个完全数是496,//他的所以因子相加等于他本身这个数就是完数int main(){int i, total = 0;for (i = 1; i < 1000; i++){total = 0;          //i的因子最多不会>i/2;for (int j = 1; j <= i / 2; j++){if (i%j == 0)total += j;//累加因子}if (total == i)printf("是完数:%d\n", i);}return 0;}

在这里插入图片描述

⭐️95.打印X型图案

在这里插入图片描述

//打印X型图案int main(){int i, j;int n = 0;do{printf("请输入一个数:\n");scanf("%d", &n);for (i = 0; i < n; i++){for (j = 0; j < n; j++){//主对角线      副对角线if (i == j || j == n - 1 - i)printf("*");else printf(" ");}printf("\n");}} while (n >= 2);return 0;}

在这里插入图片描述

⭐️96.打印空心正方形

在这里插入图片描述

//打印空心正方形int main(){int i, j;int n = 0;do{printf("请输入一个数:\n");scanf("%d", &n);for (i = 0; i < n; i++){for (j = 0; j < n; j++){//主对角线      副对角线if (i == 0|| j == 0||j==n-1||i==n-1)printf("* ");else printf("  ");}printf("\n");}} while (n >= 2);return 0;}

⭐️97.判断一个数组是否有序

⭐️利用冒泡排序,看记号flag的变化

//判断一个数组是否有序int main(){int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, flag1 = 1, flag2 = 2, i, j;for (i = 0; i < 9; i++){for (j = 0; j < 10 - 1 - i; j++){if (a[j]>a[j + 1]){//内层循环if一次没进去说明前一个总比后一个大--降序flag1 = 0;}if (a[j] < a[j + 1]){//内层循环if一次没进去说明前一个总比后一个小--升序flag2 = 0;}}//测试出升序或降序了if (flag1 == 1 || flag2 == 2)break;}for (i = 0; i < 10; i++){printf("%d ", a[i]);}if (flag1 == 1)printf("\n是升序\n");else if (flag2 == 2)printf("\n是降序\n");elseprintf("\n无序\n");return 0;}

在这里插入图片描述

⭐️98.整形数组删除指定的数字

//整形数组删除指定的数字int main(){int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int sz = sizeof(a) / sizeof(a[0]), n, i, j;printf("请输入一个数字:\n");scanf("%d", &n);for (i = 0,j=0; i < 10; i++){if (a[i] != n)//a[i]==n就不拷贝a[j++] = a[i];}//如果没有找到这个n j就一直被改变了,j和之前数组元素个数是一样的if (j == sz)printf("没有找到给定数字...\n");else {printf("=====已删除数组情况=====\n");for (i = 0; i < j; i++){printf("%d ", a[i]);}}return 0;}

在这里插入图片描述

⭐️99.给字符数组每个元素中间添加一个空格

//给字符数组每个元素中间添加一个空格int main(){char a[30] = "abc";int i = 0;// i不能=0    a b c//            01234for (i = strlen(a) - 1; i > 0; i--){a[2 * i] = a[i];a[2 * i - 1] = ' ';}printf("%s", a);return 0;}

在这里插入图片描述

⭐️100.旋转字符

//旋转字符#include<Windows.h>int main(){char *arr = "\/-|";int i = 0;while (1){i %= 4;//\r只回车不换行printf("[%c]\r", *(arr + i));i++;Sleep(60);}return 0;}

⭐️101.求sinx近似值

在这里插入图片描述

int main(){double x = 0, x0 = 0, x1 = 0, total = 0, n = 1, m = 1;printf("请输入一个数:\n");scanf("%lf", &x);total += x;//第一次+Xx1 = x;//先给前面一项赋个值int i = 2,f=1; //f是符号m = x;//m存x的初值while (fabs(x1 - x0) > 1e-6){x0 = x1;//阶乘//每次乘两次for (int t = 2; t > 0; i++){n *= i;t--;}//幂次for (int t = 2; t > 0; t--){x *= m;//m暂存的x初始值每次进来乘2次}f = -f;//改变符号x1 = f*(x / n);total += x1;}printf("%lf", total);return 0;}

在这里插入图片描述

点击全文阅读

郑重声明:

本站所有活动均为互联网所得,如有侵权请联系本站删除处理

我来说两句