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

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

	Print(num);
	int result=Swap(num);
	printf("Swap后十进制 = %d \n Swap后二进制位:\n",result);
	Print(result);
 
	return 0;
}


> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/195d7e593d6f4f17be175da257726809.png)
> 
> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/0dc481d0de5b461c9a11b1f8281122f0.png)
> 
> 
> 


### ⭐️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;
}


> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/3b34e983dd674a9a84e90547a524f046.png)
> 
> 
> 


### ⭐️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;
}


> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/01d8e29335ec40c0a83a0f728cf0f811.png)
> 
> 
> 


### ⭐️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;
}

![在这里插入图片描述](https://img-blog.csdnimg.cn/8928e20ac7664db6b95558065240c98b.png)


### ⭐️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 遍历法求名次



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/9500e3e9c8e54c56b169dc2a93ed77d3.png)
> 
> 
> 



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;
}


> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/8cb5daa208534192a0d251aee5f45f32.png)
> 
> 
> 


### ⭐️13. 谁是凶手



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/94ac918f48404f50b3b344849dda28c5.png)
> 
> 
> 



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:**



//法2
void 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;

}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/b0f4e6e59e27461582a5547821c15d56.png)
> 
> 
> 


### ⭐️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;
}


> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/f864f43fb6ca47359026a343f37c1012.png)
> 
> 
> 


### ⭐️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;
}


> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/3dab558a4ccd4243b850e061ae374515.png)
> 
> 
> 


### ⭐️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;
}


> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/a68a1818f2bf4f988a1ae00e6e9419cf.png)
> 
> 
> 


### ⭐️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;
}


> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/eab9cc813ac74820885155d9efda00c9.png)
> 
> 
> 


### ⭐️22.字符串左旋



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



//字符串左旋
//实现一个函数,可以左旋字符中的K个字符
//例如:
//ABCD左旋一个字符变成BCDA
//ABCD左旋两个字符变成CDAB
void 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;
}


![在这里插入图片描述](https://img-blog.csdnimg.cn/9c47dc5a82b7441eadd5b3a0b87da1b4.png)


### ⭐️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;
}


> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/5cc916e6481f480d860497e00f9ec3eb.png)
> 
> 
> 


### ⭐️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;
}


> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/7c25321308304253b82bdb753642b1ab.png)
> 
> 
> **注意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;

}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/bb9ed72441d34d928de6bf24c9355189.png)
> 
> 
> 


### ⭐️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=3
a = 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;

}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/9d0d56308eb14b159f3e516e03b6da46.png)
> 
> 
> 


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



> 
> **⭐️递归法:**
> 
> 
> 



//C语言编程————输入n,k,求n的k次幂(用递归的方法)
int fun(int n, int k){
if (k <1)return 1;//0次幂都是1
else 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;
}


**递归过程图:**



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/5de8c1d036264958b0d562e6be03a928.png)
> 
> 
> 



> 
> **⭐️非递归法:**
> 
> 
> 



//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 = 10
int 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;
}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/d911c4bb5d2e4b4dacfa32f73e32dd3a.png)
> 
> 
> 


### ⭐️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;
}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/f3ba12ff096b4d1c9cf5bedf0c3cd290.png)
> 
> 
> 


### ⭐️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;
}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/a7236d0b02644f6b816329e0a6f653a0.png)
> 
> 
> 


### ⭐️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;
}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/c724c2bab78a466fadd1da7ec69410b2.png)
> 
> 
> 


### ⭐️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;
}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/173c612f0596433d89c8628aea40ae0a.png)
> 
> 
> 


### ⭐️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;
}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/18e476e889c948a8b5b38bf0a511e18d.png)
> 
> 
> 


### ⭐️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里面有多少个1
int count = 0, i = 0;
while (i < 32){//移位32次 移了31位
	//右移1位与1==1就说明当前二进制位是1
	if (t >> i & 1 == 1){
		count++;
	}
	i++;
}
printf("二进制位不同有%d位\n", count);
return 0;

}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/4bac00579e37403a84d503c20408e65a.png)
> 
> 
> 


### ⭐️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.选择排序法 升序排列



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/ce2796256a474c59976d20498c1f9f99.gif#pic_center)
> 
> 
> 



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;

}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/3fe748fd9dbd4564a7e483a473ed2e90.gif#pic_center)
> 
> 
> 


### ⭐️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;

}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/d5f5c77353fd41d29711bb7ba13565f4.png)
> 
> 
> 


### ⭐️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;
//}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/295bc3d82038411cb4081b595826e565.png)
> 
> 
> 


### ⭐️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 说明当前左边的全小于n
		left = mid;//所以left等于mid
	}
	else if (a[mid]>n){//中间元素>n 说明当前右边的全大于n
		right = mid;//所以right等于mid
	}
	else {
		printf("找到了 下标是%d\n", mid);
		break;
	}
	mid = (left + right) / 2;//在除以2改变循环条件
}

if (left >= right)printf("没有找到该元素\n");
return 0;

}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/5c4a5653379f4d458345727a432ba6ff.png)
> 
> 
> 


### ⭐️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;

}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/c849fccda78b46dc82d66e48041be7f1.png)
> 
> 
> 


### ⭐️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;
}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/e55d5803e3884b998ad4bfabdd032b02.png)
> 
> 
> 


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



> 
> **⭐️方法1:计数器法**
> 
> 
> 



//模拟strlen
//方法1 普通式
int My_strlen(char *a){//abc
int count = 0;
while (*a != ‘\0’){//不是’\0’ count就加1
count++;
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){//abc
int *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){//abc
if (*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;
}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/6b6185552fb14dd89caabccce083a43b.png)
> 
> 
> 


### ⭐️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;
}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/2a2a28e8584e43eea8de17d80800f7d2.png)
> 
> 
> 


### ⭐️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;

}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/d743375ae79f4df0bacb51c3e2036464.png)
> 
> 
> 


### ⭐️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;

}


![在这里插入图片描述](https://img-blog.csdnimg.cn/6859d6df85f942c8b75225bbc8d021c0.png)


### ⭐️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;

}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/7dee8c5cce17426097ca46dbb5f1808e.png)
> 
> 
> 


### ⭐️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;

}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/040dd3929bf24a91a8dd9df18f2d3df1.png)
> 
> 
> 


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



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/c775da47d422411daed8ead28514278c.png)  
>  ![在这里插入图片描述](https://img-blog.csdnimg.cn/97eac0c5199249449eb709700c030c4b.png)
> 
> 
> 



//模拟寻找子串的函数strstr
char * 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];//abcdef
char b[20];//abcdefj 查找a数组里面有没有bcd
printf(“请输入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;
}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/fe4a5c4d0e1c482f8e023911499419a5.png)
> 
> 
> 


### ⭐️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;
}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/8797e6e353d34407ab8d857ec302da22.png)
> 
> 
> 


### ⭐️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;
}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/98f8d65335f64aa8aad3c86fd59f71ed.png)
> 
> 
> 


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


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



> 
> **⭐️解释:**![在这里插入图片描述](https://img-blog.csdnimg.cn/3a2e46f499314e068eeceb8816ecbb10.png)
> 
> 
> 



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.输入四位数字输出四个字符



> 
> **⭐️解释:**![在这里插入图片描述](https://img-blog.csdnimg.cn/6374e8c3dfc94b80bc6ec40b02ac9ce0.png)
> 
> 
> 



//输入四位数字输出四个字符
//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;
//}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/778c921890f44e8c8c7524780e56f2c6.png)
> 
> 
> 


### ⭐️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);

}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/d3e92d54550646f899c272be50dcd0d8.png)
> 
> 
> 


### ⭐️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就外层指针+1
	else 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;
}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/acd8041d6f45437884d0902e2013e3c6.png)
> 
> 
> 


### ⭐️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;
}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/0a98a9d8a52248f2bbfb324513c80ef0.png)
> 
> 
> 


### ⭐️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要指向先前的最小数下标min
for (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**
> 
> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/2f64409277fb4d4eac22c023c9538122.png)
> 
> 
> 


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



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

int main(){
int a[300], n, i=0, j=0, k=0;
/*思路:
1.为数组赋值n个数
2.结束条件是ttn-1也就是 淘汰掉了n-1个还剩一个人
3.a数组元素不为0 报数+1
4.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 报数+1

		if (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 从新开始**
> 
> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/924317a195b24d63920b40f2139af4a6.png)
> 
> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/e379600e09704643ab82ea3ec517ec8d.png)
> 
> 
> 


### ⭐️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;

}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/f7021bbcb8314417bf571c0a50dcaef1.png)
> 
> 
> 


### ⭐️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_end

return 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数组下标****
> 
> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/3f0763030eb04952bfbe113b3156874f.png)
> 
> 
> 


### ⭐️65.结构体指针问题



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/f8510e3fa2d04f94aa8fd71bcc4aaa35.png)
> 
> 
> 


### ⭐️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;
}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/bc6a8d563b774025a7b4245c39ffad4d.png)
> 
> 
> 


### ⭐️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]短就进入if
len = strlen(a[i]);//把短的这串的长度给len
flag = i;//存最短字符串的下标
}
}

printf("最短第字符串是:%s \n", a[flag]);

}
int main(){
char a[3][20] = {“abxc”,“abc”,“hello”};
Find_minlen(a);
return 0;
}



> 
> ![在这里插入图片描述](https://img-blog.csdnimg.cn/4b5a71ede37d48c3ba1156d6711e4e07.png)
> 
> 
> 


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



![img](https://img-blog.csdnimg.cn/img_convert/78d74ebb3cc67d3eacfd0d9d7755d9a6.png)
![img](https://img-blog.csdnimg.cn/img_convert/491c44fd0ad92d31f85572f74adc91f2.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**

字字符
 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\_end

	return 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]短就进入if
			len = strlen(a[i]);//把短的这串的长度给len
			flag = i;//存最短字符串的下标
		}
	}

	printf("最短第字符串是:%s \n", a[flag]);
}
int main(){
	char a[3][20] = {"abxc","abc","hello"};
	Find\_minlen(a);
	return 0;
}

在这里插入图片描述

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

[外链图片转存中…(img-VWrDiGWH-1715738889127)]
[外链图片转存中…(img-rX6BeLw2-1715738889128)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值