write in front
大家好,我是謓泽,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流
2021年度博客之星物联网与嵌入式开发TOP5~2021博客之星Top100~阿里云专家^星级博主~掘金⇿InfoQ创作者~周榜34»总榜1892
本文由 謓泽 原创 CSDN首发如需转载还请通知⚠
个人主页⇥打打酱油desuCSDN博客
欢迎各位→点赞 + 收藏⭐️ + 留言
系列专栏⇥【C】题目_謓泽的博客-CSDN博客[〇~①]
✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本
『C~题集』of ⒐
write in front
第四十一题→数字每一位之和『递归』
第四十二题→冒泡排序
第四十三题→学习小组
第四十四题→正整数的相乘
第四十五题→数组元素交换
第四十一题の代码
第四十二题の代码
第四十三题の代码
第四十四题の代码
第四十五题の代码
输入一个无符号数字,无非就是用输入函数scanf()进行输入,但是要注意下这是无符号输入那么我们就要在数据类型前面加上unsigned(无符号类型)才可以。
计算数字每一位之和,就是假设我们输入的数字是19,那么就是相当于9+1=10,这样。
用递归进行实现,在前面的题已经都说过了,那么再来说下。
概述:一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层,当最内层的函数执行完毕后,再一层一层地由里到外退出。
那么递归它也是具有限制条件的,不然它就会造成死递归,这个就相当于死循环一样。
存在限制条件,当满足这个限制条件之后的时候,递归便会不再继续。
每次递归调用之后都会越来越接近这个限制条件。当然,这道题目不用递归也是非常好解决的,关键点就两行代码如下↓
sum += n % 10;//求个位sum = sum + n % 10
n = n / 10; //把个位抹去
题目内容→创建一个函数Bubble_Sort()实现冒泡排序。
比较相邻的元素。如果第一个比第二个大,就交换他们两个。
对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定性算法。
冒泡排序基础的排序算法,也是我们必须要牢牢掌握的一种算法。
题目内容→张三同学有一个学习小组有⑤个人,每个人有③门课的考试成绩,求全组分科的平均成绩和各科总平均成绩,请用C语言编程帮张三同学实现一下吧。
输入描述:三行输入,分别输入五个人的语文成绩,数学成绩、英语成绩。
输出描述:二行输出,一门学科的平均分和三门各科总平均分。
题解思路如下↓
这道题目主要的就是考察下对数组的使用(一维数组、二维数组),注意:当我们计算完当前科目的总成绩的时候,并且它进行了当前科目的平均分。要记得给它在当前科目总成绩进行清0的操作。
题目内容→本道题目要求使用递归来实现不使用 * 运算符,实现两个正整数的相乘。
其实递归我们已经在前面的题型已经讲了很多次了,这里再把递归的限制条件说下↓
每一个递归函数都应该只进行有限次的递归调用,否则它就会进入死胡同,永远也不能退出了,这样的程序是没有意义的。
存在限制条件,当满足这个限制条件之后的时候,递归便会不再继续。
每次递归调用之后都会越来越接近这个限制条件。
实际上递归不用看的太过于复杂,把递归看的简单点,了解题的特性实际上这样使用递归效果更好。这也是我推荐初学者认识递归的最好的办法。像这道题目我jiode是函数实参肯定是要有两个参数的,首先题目要求了我们是不能使用乘法并且是递归的,那么我们还有加减法,那么可以思考下怎么样往这方面用递归的方法来解决,4 * 4 = 16 = (4 + 4 * (4-1))就比如这个那么你是不是可以弄成递归的特性来解决呢。注:递归的限制条件在这里是非常的容易的,由于0x任何数都得0那么我们这里就可以设 a 或 b 二者位限制条件。
题目内容→将数组 arr1 的元素的数字和数组 arr2 的元素的进行交换。
int arr1[5] = { 1, 3, 5, 7, 9 };
int arr2[5] = { 2, 4, 6, 8, 10 };
把这两组的值进行交换,得到下面交换的值。如下所示↓
int arr1[5] = { 2, 4, 6, 8, 10 };
int arr2[5] = { 1, 3, 5, 7, 9 };输出内容:要把每个元素给打印出来,交换前的元素和交换后的电路。
这道题目如果你会把两个变量进行交换的方法,那么你就可以很轻松的解决这道题目了。只不过还加上了一维数组的知识点。稍稍的比普通的交换难上了那么一丢丢而已,那么快点去实现它吧。
#define _CRT_SECURE_NO_WARNINGS 1
#include
int print(unsigned int n)
{
//这里之所以是n>9是因为n<10的话无论我们输入什么数字都是最终相加之和
if (n > 9)
{
//取模得到个位,除以得到十位。
return print(n / 10) + n % 10;
}
else
{
return n;
}
}
int main(void)
{
unsigned int num = 0;
printf("请输入数字→");
scanf("%d", &num);
int ret = print(num);
printf("ret = %d\n", ret);
return 0;
}
运行结果
请输入数字→1234
ret = 10
#define _CRT_SECURE_NO_WARNINGS 1
#include
void Bubble_Sort(int arr[],int sz)
{
int i = 0;
//确定排序的次数
for (i = 0; i < sz - 1; i++)
{
//每次交换的次数,第一次交换次数n-1,依次......
int j = 0;
//防止无效循环,也就是当我们数组已经是冒泡排序的情况。
int flag = 1;
//确定交换的次数。
for (j = 0; j < sz - 1 - i; j++)
{
//第一个数字和第二个数字比较,当第一个数字大于第二个数字时候进行交换。
if (arr[j] > arr[j + 1])
{
//创建临时变量,进行交换!
int change;
change = arr[j];
arr[j] = arr[j+1];
arr[j+1] = change;
flag = 0;
}
}
if (flag == 1)
{
break;
}
}
}
int main(void)
{
int i = 0;
//数组的逆序排序
int arr[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 };
//sz是数组总元素的大小
int sz = sizeof(arr) / sizeof(arr[0]);
//调用函数
Bubble_Sort(arr,sz);
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
运行结果
0 1 2 3 4 5 6 7 8 9
#define _CRT_SECURE_NO_WARNINGS 1
#include
int main()
{
int i = 0;
int j = 0;//循环初始化下标
int arr[3][5] = { 0 };//行-科目,列-学生。
int sum = 0; //当前科目的总成绩
int average = 0; //总平均分
int v[3]; //各科平均数
printf("请输入各科学生的成绩:\n");
for (i = 0; i < 3; i++)
{
printf("\n一门学科数入5次成绩\n");
if (i == 0)
printf("数学学科:");
if (i == 1)
printf("语文学科:");
if (i == 2)
printf("英语学科:");
for (j = 0; j < 5; j++)
{
scanf("%d", &arr[i][j]); //输入每个同学的各科成绩
sum += arr[i][j]; //计算当前科目的总成绩(sum)
}
v[i] = sum / 5; // 当前科目的平均分,用总的成绩除以5
sum = 0; // 把当前科目总成绩清0
}
printf("\n数学成绩 = %d\n语文成绩 = %d\n英语成绩 = %d\n", v[0], v[1], v[2]);
average = v[0] + v[1] + v[2];
printf("平均分: %d\n", average / 3);
return 0;
}
运行结果
请输入各科学生的成绩:
一门学科数入5次成绩
数学学科:80 80 80 80 80
一门学科数入5次成绩
语文学科:90 90 90 90 90
一门学科数入5次成绩
英语学科:100 100 100 100 100
数学成绩 = 80
语文成绩 = 90
英语成绩 = 100
平均分: 90
#define _CRT_SECURE_NO_WARNINGS 1
#include
int Multiply(int a, int b)
{
if (b == 0)
{
return 0;
}
return a + Multiply(a, b - 1);// a + a * b
}
int main(void)
{
int i = 0;
int j = 0;
printf("请输入两个数字:");
scanf("%d %d", &i, &j);
Multiply(i, j);
printf("%d\n", Multiply(i, j));
return 0;
}
运行结果
请输入两个数字:4 5
20
#include
#define number 5
int main(void)
{
int i = 0;
int arr1[number] = { 1, 3, 5, 7, 9 };
int arr2[number] = { 2, 4, 6, 8, 10 };
for (i = 0; i < number; i++)
{
printf("没交换之前的值:arr1[%d] = %d\n",i + 1, arr1[i]);
}
for (i = 0; i < number; i++)
{
printf("没交换之前的值:arr2[%d] = %d\n", i + 1, arr2[i]);
}
printf("\n");
int sz = sizeof(arr1) / sizeof(arr1[0]);
for (i = 0; i < sz; i++)
{
int tmp;
tmp = arr1[i];
arr1[i] = arr2[i];
arr2[i] = tmp;
printf("arr1[%d] = %-2d ", i + 1, arr1[i]);
printf("arr2[%d] = %-2d\n", i + 1, arr2[i]);
}
return 0;
}
运行结果
没交换之前的值:arr1[1] = 1
没交换之前的值:arr1[2] = 3
没交换之前的值:arr1[3] = 5
没交换之前的值:arr1[4] = 7
没交换之前的值:arr1[5] = 9
没交换之前的值:arr2[1] = 2
没交换之前的值:arr2[2] = 4
没交换之前的值:arr2[3] = 6
没交换之前的值:arr2[4] = 8
没交换之前的值:arr2[5] = 10
arr1[1] = 2 arr2[1] = 1
arr1[2] = 4 arr2[2] = 3
arr1[3] = 6 arr2[3] = 5
arr1[4] = 8 arr2[4] = 7
arr1[5] = 10 arr2[5] = 9