c语言百日刷题第四天

目录

1.用筛选法求100之内的素数

2.用选择法对10个整数排序

 3.求一个3*3的整型矩阵的对角线之和

4.有一个已排序好的数组,要求输入一个数后,按原来排序的规律将它插入数组中

5.将一个数组中的值按逆序排放


生活不止眼前的苟且还有诗和远方!!!这些天交杂这备赛,又经历一下午一道题没写出来,差点崩溃,但还是相信坚持下来一定很酷,在此和大家一起共勉!!!修修脑子,做做书本习题.

1.用筛选法求100之内的素数

筛选法:筛选法又称筛法,具体做法是:先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。因为希腊人是把数写在涂蜡的板上,每要划去一个数,就在上面记以小点,寻求质数的工作完毕后,这许多小点就像一个筛子,所以就把埃拉托斯特尼的方法叫做“埃拉托斯特尼筛”,简称“筛法”。(另一种解释是当时的数写在纸草上,每要划去一个数,就把这个数挖去,寻求质数的工作完毕后,这许多小洞就像一个筛子。)

题目分析:质数的倍数一定是合数,所以从前往后筛选;我们还知道一个数的因数往往出现在前面,例如1-10的因数出现在1-5中,利用这一特性,可以缩减时间复杂度

#include
#include
int main() {
	int a[101];
	for (int i = 1; i <=100; i++)//读入数字,a[0]没用
			a[i] = i;
	for(int i=2;i

2.用选择法对10个整数排序

选择排序法:选择排序法的第一层循环从起始元素开始选到倒数第二个元素,主要是在每次进入的第二层循环之前,将外层循环的下标赋值给临时变量,接下来的第二层循环中,如果发现有比这个最小位置处的元素更小的元素,则将那个更小的元素的下标赋给临时变量,最后,在二层循环退出后,如果临时变量改变,则说明,有比当前外层循环位置更小的元素,需要将这两个元素交换

题目分析:这题主要是考察选择排序法的应用,注意和冒泡排序法的区别,冒泡排序法是两两元素比较交换,而选择排序法是假设第一个元素是最小或者最大值,然后和后面的元素比较排序

#include
int main() {
	int a[10], t, min;
	for (int i = 0; i < 10; i++)//读入元素
		scanf("%d",&a[i]);
	for (int i = 0; i <=8; i++) {
		min = i;
		for (int j = i+1; j<=9; j++) {
			if (a[min] > a[j])
				min = j;
				t = a[i];
				a[i] = a[min];
				a[min] = t;
		}
	}
	for (int i = 0; i < 10; i++)
		printf("%d ", a[i]);
	return 0;
}

 3.求一个3*3的整型矩阵的对角线之和

题目分析:这题数据比较少,完全可以暴力

#include
int main() {
	int a[3][3], sum;
	for (int i = 0; i < 3; i++)
		for (int j = 0; j < 3; j++)
			scanf("%d", &a[i][j]);
	sum = a[0][0] + a[1][1] + a[2][2] + a[0][2] + a[2][0];
	printf("%d", sum);
	return 0;
}

4.有一个已排序好的数组,要求输入一个数后,按原来排序的规律将它插入数组中

题目分析:要插入,第一步当然要找到它要插入的位置,然后将后面的元素都往后移动

#include
int main() {
	int x, i;
	int k = 0;
	int a[11] = { 14,25,28,33,45,56,68,72,81,95 };
	scanf("%d", &x);
	while (x > a[k] && k <= 10)//找到要插入的元素的位置
		k++;
	for (i = 10; i > k; i--)//把后面的元素往后面移动
		a[i] = a[i - 1];
	a[k] = x;//插入
	for (i = 0; i <= 10; i++)//输出
		printf("%d ", a[i]);
	return 0;
}

5.将一个数组中的值按逆序排放

题目分析:第一种就是找到第一个和最后一个元素的角标关系,然后交换,以此类推;

第二种就是直接for循环,角标逆序输出

#include
int main() {
	int t;
	int a[10] = { 14,25,28,33,45,56,68,72,81,95 };
	for (int i = 0; i < 5; i++) {
		t = a[i];
		a[i] = a[9-i];
		a[9 - i] = t;
	}//i对应n-1-i,很容易发现,然后计算次数为n/2
	for (int i = 0; i < 10; i++)
		printf("%d ", a[i]);
	return 0;
}

关于第二种这里就大家想想,也算一种暴力法

你可能感兴趣的:(刷题记,c语言,开发语言)