C语言期末考试必会的编程题,掌握了保证你能不挂科

第一题:判断素数

素数定义:质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数

思路:比如一个数5,判断它是不是素数,就从2开始到4,用5来除它们。如果没有一个能整除,说明5是一个素数,反之就不是素数。

代码:

#include<stdio.h>
int isPrime(int a);  //Prime:素数 
 
int main()
{
	int n;
	printf("请输入大于一或等于一的整数:\n");  //1以下没有素数 
	scanf("%d",&n);  //从终端读取一个数 
	while (n<1)  //这个循环是当你输入小于1的数时提醒你重新输入的 
	{
		printf("输入错误,请重新输入:\n");
		scanf("%d",&n); 
	}            //当输入大于1时跳出循环进入下面程序 
	if (isPrime(n)==0)   //在这里引用了函数isPrime,判断条件是isPrime函数的值为0,可以先翻到下面看isprime函数 
	{
		printf("%d不是素数",n);  //isPrime的值是0,说明n不是素数 
	}else{
		printf("%d是素数",n); //isPrime的值不是0,说明n是素数
	}
	return 0;
 } 
 
int isPrime(int a)  //(int a)是形参,等于的是main里的实参n 
{ 
	int i=1; //先声明i=1; 
	for (int j=2;j<a;j++)  //让j从2开始,每次加1,加到a -1 
	{
		if (a%j==0)  //如果a除以j出现了等于0的情况,也就是说a可以整除j,即是素数 
		{
			i=0;  //把i赋值为0 
			break;  //结束循环 
		}
	}  
	if (a==1)  //如果传入的a就是1呢,不满足上面循环的条件j<a,因此不会进入循环 
	{
		i=0;  //在这里补上i=0,也就是1不是素数 
	}
	return i;  //把i的值返回 

第二题:排序(冒泡法)

思路:每次将相邻的两数比较,把小的排到前面。若有6个数,第一趟比较时,最大的数下沉到最底部,最小的数上浮一个位置;第二趟比较时,次最大的数下沉到倒数第二的位置,最小的数又上浮一个位置。如此进行5次,底部的5个都以排好,最上面的自然也是最小的,就可以完成排序。

代码:

#include<stdio.h>

int main()
{
	int len=10;  //数组长度 
	int a[10]={13,5,76,99,1,-4,0,8988,666,6};   //定义数组元素 
	for (int i=0;i<len-1;i++)    //外循环: 进行9趟比较 
	{   
		for (int j=0;j<len-1-i;j++)  //内循环: 在每一趟比较中进行9-j次 
		{
			if (a[j]>a[j+1])  //如果前一个大于后一个 
			{
				int tmp=a[j];  //交换两数 
				a[j]=a[j+1];
				a[j+1]=tmp;
			}
		}
	}
	for (int t=0;t<len;t++){  //遍历输出排好序的数组 
	printf("%d ",a[t]);
	}
	return 0;
 } 

第三题:排序(选择排序法)

思路:假设数组有10个元素。第一轮先让数组内每相邻两个数之间比较,记录下最大的数所在的位置,让它和数组最后一个元素交换位置;第二轮,让还没排好序的前面的数相邻之间互相比较,记录下第二大的数,让他和数组倒数第二个元素交换位置,以此类推,重复9轮即可排好顺序。

代码:

#include<stdio.h>

int main()
{
	int a[10]={12,87,8,43,2,22,1,8,19,-145};
	int len=(sizeof(a)/sizeof(a[0])); //数组a的元素数量 
	
	for (int j=len-1;j>0;j--) //外循环:从a[9]到a[1] 
	{
		int maxid=0; //假设a[0]是最大的 
		for (int i=1;i<j+1;i++) //内循环:把a[0]和后面的每一个数比较 
			{
			if (a[maxid]<a[i])
				{
					maxid=i; //记录下最大的数的下标 
				}
			}
		int tmp=a[maxid]; //把最大的数放到最后面,第二大的放到倒数第二位,以此类推 
		a[maxid]=a[j];
		a[j]=tmp;			
	}
	
	for (int n=0;n<len;n++) //遍历数组输出排完序的结果 
	{
		printf("%d ",a[n]);
	 } 
	return 0;
 } 

第四题:二分法搜索(查找)

思路:给出一个数字从小到大排列好的数组,第一步先读取中间的数(用(mid=right+left)/2),看是不是要找的数,如果不是,比较中间的数和要找的数的大小,如果要找的数比中间的数小,那么我们就把搜索的目光转向[0,中间的数-1],在这个缩小了的范围继续重复刚才的步骤,直至找出那个数,如果left>right还没有找到,那么搜索会结束,表面,数组里没有要找的那个数

二分法的好处:二分法比一个一个找要方便的太多了,在100个数字的范围里找一个数,最多只需要7次,而在1百万的量级中,也仅仅只需要20次

代码:

#include<stdio.h>

int search(int *input,int len,int k);

int main()
{
	int a[12]={-1,0,5,8,13,20,34,15,37,50,88,100};
	int k=50;  //要找的那个数 
	int len=sizeof(a)/sizeof(a[0]);  //数组的元素数 
	int ret=search(a,len,k);  //引用search函数 
	printf("%d在a[%d]这里",k,ret);
	return 0;
 } 
 
int search(int *b,int len,int k)
{
	int left=0;  
	int right=len-1;
	
	while (right>left)  /*right在left左边,肯定比left大,要是比left小了,说明在数组里没有那个要找的数,我
	                    们就是要一直找到right比left小为止,所以right>left是循环条件*/ 
	{
		int mid=(left+right)/2; //二分法从中间开始找 
		if (b[mid]==k) // 如果找到了 
		{
			return mid;  //把位置的下标return回主函数 
			break;       //然后结束 
		}else if (b[mid]<k){  
			left=mid+1;  //如果k比mid大,说明k在mid右边,把搜索区域缩小到[left=mid+1,right] 
		}else{
			right=mid-1;  //如果k比mid小,说明k在mid左边,把搜索区域缩小到[left,right=mid-1] 
		}
	}	
}

更多推荐

C语言大一期末考试必会编程题