最大公约数和最小公倍数求法和简单排序

本文介绍了如何判断素数,包括优化的判断方法,详细讲解了最大公约数的求法,如更相减损之术和欧几里得算法,并阐述了最小公倍数的计算,以及几种排序算法,如冒泡排序、选择排序和快速排序的基本原理和实现步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

判断素数:判断一个数是否是素数,n不必被2~(n-1)的整数整除,只需被2~n/2之间的整数整除即可,甚至只需要被2~根号n之间的整数整除即可。

最大公约数求法: a与b的最大公约数是指能同时整除a与b的最大的整数

  • 更相减损之术:以两数中较大的数减去较小的数,获得的差与原先较小的数构成新的一对数,再以大的数减去小的数,依次循环。例如:(12,16)?(12,4)?(8,4)?(4,4)最大公约数为4
  • 辗转相除法(欧几里得算法):用较大的数除以较小的数,余数和较小的数构成新的一对数,继续上面的除法,直到大数被小数除尽为止,则较小的数就是最大公约数。例如:(288,123)?(42,123)?(42,39)?(3,39)可见,3就是288和123的最大公约数

最小公倍数求法:a与b的最小公倍数是可以同时被a和b整除的最小整数

                                           最小公倍数=a*b/最大公约数     


                      

查找的方法:

  1. 顺序查找:从表的一端开始,向另一端逐个进行记录的关键字和给定值的比较。若某个记录的关键字与给定值相等,则查找成功,并给出记录在查找表中的位置;若经过比较,所有记录的关键字与给定值都不相等,则查找失败,给出失败信息。
  2. 折半查找(二分法查找):要求查找表中的记录必须按关键字有序排列,并且查找表必须以顺序方式存储。其查找过程为:在有序的查找表中,取中间位置的记录作为比较对象,若给定值与中间位置记录的关键字相等,则查找成功;若给定值大于中间位置记录的值,则继续查找大的一边,若给定值小于中间位置记录的关键字值,则继续查找小的一边。依次不断重复上述查找过程,直到查找成功为止。若在查找范围内所有记录的关键字都与给定值不等,则查找失败。

排序的方法:

  • 冒泡排序:冒泡排序是最为简单的一种排序,通过重复走完数组的所有元素,通过打擂台的方式两个两个进行比较,直到没有数可以交换的时候结束这个数,再到下个数,直到整个数组排好顺序。因一个个浮出所以叫冒泡排序。算法描述: 
  1. 比较相邻两个数据,如果第一个比第二个大,就交换两个数;
  2. 对每一个相邻的数做同样的工作,这样从开始一队到结尾一队在最后的数就是最大的数;
  3. 针对所有元素做上面的操作,除了最后一个;
  4. 重复1~3,直到顺序完成。

代码可视化:

void BubbleSort(int arr[], int a)//冒泡排序算法
{
	if (arr == NULL || a <= 0)
	{
		return;
	}
	int temp;
	for (int i = 0; i < a; i++)
	{
		for (int j = i + 1; j < a; j++)
		{
			if (arr[i]>arr[j])
			{
				temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
			}
		}
	}
	printf(arr, a);
}
  • 选择排序:选择排序是最直观的排序,通过确认一个key最大或最小值,再从待排序的数中找出最大或最小的交换到对应位置。再选择次之。算法描述:
  1. 在一个长度为N的无序数组中,第一次遍历n-1个数找到最小的和第一个数交换;
  2. 第二次从下一个数开始遍历n-2个数,找到最小的数和第二个数交换;
  3. 重复以上操作直到第n-1次遍历最小的数和第n-1个数交换,排序完成。

算法描述:

void SelectSort(int arr[], int a)//选择排序
{
	if (arr == NULL || a <= 0)
	{
		return;
	}
	for (int i = 0; i < a; i++)
	{
		int MinKey = arr[i];
		for (int j = i; j < a; j++)
		{
			if (MinKey>arr[j])
			{
				int temp = arr[j];
				arr[j] = MinKey;
				MinKey = temp;
			}
		}
	}
	arr[i] = MinKey;
}
  • 快速排序:快速排序是排除稳定性因素后最常用的排序。给看官介绍两种使用方法:一种是直接在头文件stdlib.h头文件中的qsort函数实现是和正常写代码一样的,通常使用qsort(数组名、长度、sizeof(第一个数长度)、complnc/comoDec)进行实现数组的排序,后面是通过递归调用的形式。算法描述:
  1. 从数列中挑出一个元素作为基准;
  2. 重新排列数列,把所有的比基准小的放在基准前面,反之放在后面(一样大可任意一边)完成后基准处在分区的中间位置;
  3. 通过递归调用把小于基准元素和大于基准元素的子序列进行排序。

代码实现:

//程序中可以通过 qsort函数调用
int compInc(const void* a, const void* b)//快排递增
{
	return*(int*)a - *(int*)b;
}
int compDec(const void*a, const void*b)//快排递减
{
	return *(int *)b - *(int *)a;
}
//直接使用即可
void quicksort(int left, int right)
{
	int i, j, t, temp;
	if (left > right)
	{
		return;
	}
	else
	{
		temp = a[left];//temp中存的就是基准数
		i = left;
		j = right;
		while (i != j)
		{
			//顺序很重要,要先从右边开始找
			while (a[j] >= temp && i < j)
			{
				j--;
			}
			//再找左边的
			while (a[i] <= temp && i < j)
			{
				i++;
			}
			//交换两个数在数组中的位置
			if (i < j)
			{
				t = a[i];
				a[i] = a[j];
				a[j] = t;
			}
		}

	}
	//最终将基准数归位,放在第i个位置
	a[left] = a[i];
	a[i] = temp;
	quicksort(left, i - 1);//继续处理左边的,这里是一个递归的过程
	quicksort(i + 1, right);//继续处理右边的,这里是一个递归的过程
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值