C语言期末考试必会的编程题,掌握了保证你能不挂科
NO.1 判断素数
素数定义:素数又称质数,是指一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数;比如1,2,3,5,7,9,是素数,4,6,8,10不是素数。
思路:比如一个数5,判断它是不是素数,就用5依次除以2~4的每一个数,如果每次除的余数都不为0,那么说明不能整除,也就是素数。如果余数出现一个为0的,说明能够整除,则为素数。
代码:
#include<stdio.h>
int isPrime(int a); //函数头(Prime是素数的英文)
int main()
{
int n;
printf("请输入大于或等于一的整数:\n");
scanf("%d",&n); //从终端读取一个数,并赋值给n
if (isPrime(n)==0) //判断条件是isPrime(n)==0
{
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;若不是素数,则i为0
for (int j=2;j<a;j++) //让j从2开始,每次加1,加到a -1
{
if (a%j==0) //如果a除以j出现了等于0的情况,也就是说a可以整除j,那么a即是素数
{
i=0; //把i赋值为0
break; //结束循环,只要出现一个能整除的,就不是素数
}
}
if (a<=1) //考虑输入的数小于等于1的情况,均不可能是素数
{
i=0;
}
return i; //把i的值返回
}
考察知识点:
if选择语句
for循环语句
函数的定义和调用
NO.2:冒泡法排序
思路:对于10个元素的数组,需要比较9次,每一轮中,需要将每相邻的两数比较,把大的数调到右边,使大的数下一次继续和右边的数比较,全部比较完之后,最大的数就“沉”到了右边,如此比较9轮,即可将10个数按从小到大排列好。
代码:
#include<stdio.h>
#define n 10 //预处理:n用10替换
int main()
{
int a[n]={13,5,76,99,1,-4,0,8988,666,6}; //定义数组元素
for (int i=0;i<n-1;i++) //外循环:共进行n-1轮比较
{
for (int j=0;j<n-1-i;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<n;t++){ //遍历输出排好序的数组
printf("%d ",a[t]);
}
return 0;
}
考察知识点:
嵌套循环
数组的定义和用法
if选择语句
NO.3 选择法排序
思路:假设数组有10个元素a[0]~a[9],将a[0]与a[1]~a[9]比较,若a[0]比a[1]~a[9]都小,则不进行交换。若a[1]~a[9]有一个以上比a[0]小,则将其中最小的一个与a[0]交换,此时a[0]中存放的是十个里最小的数。第二轮将a[1]与a[2]~a[9]比较,将剩下的9个数的最小者a[min]与a[1]交换,此时a[0]中存放的是十个里第二小的数,以此类推,共进行9轮比较,即可将十个元素按从小到大的顺序排序好。
代码:
#include<stdio.h>
#define n 10
int main()
{
int a[10]={12,87,8,43,2,22,1,8,19,-145};
for (int i=0;i<n-1;i++) //外循环:共需要比较n-1次
{
int min=i; //假设a[i]是最小值
for (int j=i+1;j<=n-1;j++) //内循环:把a[min]和右边的每一个数比较
{
if (a[min]>a[j])
{
min=j; //把小的数的下标赋给min
}
} //经过充分比较后,a[min]就是最小的那个数
int tmp=a[min]; //把最小的数a[min]和a[i]交换位置
a[min]=a[i];
a[i]=tmp;
}
for (int t=0;t<n;t++) //遍历数组输出排完序的结果
{
printf("%d ",a[t]);
}
return 0;
}
考察知识点:
嵌套循环
数组的定义和用法
if选择语句
NO.4:二分法查找
思路:给出一个数字从小到大排列好的数组,第一步先读取中间的数即(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]
}
}
}
考察知识点:
whil循环语句
数组与指针的关系文章来源:https://www.toymoban.com/news/detail-753979.html
break的用法文章来源地址https://www.toymoban.com/news/detail-753979.html
到了这里,关于C语言大一期末考试必会编程题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!