版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第第页大一c语言期末考试编程题1.判断素数第一题:判断是否为素数,若是,则返回1,否则返回0,若输入1或比1小的数字返回0。intis_Prime(inta)//素数判断,是则返回1,不是返回0,-1表示输入的值有问题{inti=0;if(a<=1)return-1;for(i=2;i<=sqrt(a);i++){if(a%i==0)return0;}return1;}这里有同学可能不明白为什么for(i=2;i<=sqrt(a);i++)简单解释一下:因数都是成对出现的,比如100,其可以分为1和100,2和50,4和25,由此可见其中一个必然小于等于100的开方,另一个则大于等于100的开方。这种判断素数的方法,应付考试足以,但想要更上一层楼这却远远不够,大家可以去了解一下筛法。2.数组排序期末考试的排序方法常常有两种:选择排序、冒泡排序。voidsortarry2(int*a,intn)//冒泡排序{ inti,j;for(i=0;i<n-1;i++)//此处只需比n-1次for(j=1;j<n-i;j++)//每次比好后,只需比n-1-i次{if(a[j]<a[j-1]){inttemp;temp=a[j-1];a[j-1]=a[j];a[j]=temp;}}return;}这是冒泡排序(从小到大),顾名思义就是每次让较大的数想气泡一样浮上去,对于为什么第一个for语句只需比n-1次,大家想想,现在排5个数,四个较大数浮上去了,最后一个还用比吗?同样第二语句为什么只需比n-1-i次也是同样的道理。voidsortarry1(int*a,intn)//选择排序{inti,j;for(i=0;i<n-1;i++)for(j=i+1;j<n;j++){if(a[i]>a[j]){inttemp;temp=a[i];a[i]=a[j];a[j]=temp;}}return;}了解了冒泡排序后,选择排序就十分好理解了,这里就不多说了。对于大多数学校,会这两种算法应付期末考试足以,但其实排序的方法还有很多,基础的插入排序,高级一点的快速排序。3.二分查找二分查找,分治法里面的一种,有叫折中查找。但二分查找必须有个前提,就是对于查找对象,必须是已经排好序的。一般期末考试常考的是对数组的排序。intsearch(int*a,intkey,intn)//二分法查找,返回值为当前数组的下标{intfirst=0;intlast=n-1;intmid=0;while(first<last){mid=(first+last)/2;if(a[mid]>=key){last=mid;}else{first=mid+1;}}if(a[last]==key)returnmid;return-1;//表示没找到}我查了一下,网站上大多数的二分查找,都是找到了就返回,可我们常常遇到的题目确实,要返回第一数的位置。所以if(a[mid]>=key)这个语句起了关键作用。4.最大公约数对于最大公约数,大致思路有两种,直接循环、采用辗转相除法。这里直接讲第二种,这方法好像高中学过,又名欧几里得算法。内容就是:两个整数的最大公约数等于,大的除以小的余数,循环或递归,直至整除余0后的整数。至于为什么,百度吧。intGCD(inta,intb)//最大公约数{if(b==0)return0;elsereturnGCD(b,a%b);}当然循环也可实现,intgcd(inta,intb){inttemp;while((a%b)!=0){temp=a%b;a=b;b=temp;}returnb;}大多数疑问的是为什么不用确保是大数除小数当a<b时,a%b==a;此时第一个循环就会把位置换过来。5.最小公倍数如果会求最大公约数,那么最小公倍数就太简单了。最大公倍数*最大公倍数=a*b至于证明,去问百度吧。接下来差不多都是水题。6.下述程序段是要实现在数组中查找最大元素和最小元素的下标,请补充。如果上述题目都会,那么这题目就太简单了,直接上代码。voidfind(int*a,intn,int*max,int*min){inti;*max=*min=0;for(i=1;i<n;i++){if(a[i]>a[*max])*max=i;elseif(a[i]<a[*min])*min=i;}return;}7.猴子吃桃题猴子吃桃问题,猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子。求第一天共摘多少桃子?intmain(){inti,count=1;for(i=1;i<10;i++){count=(count+1)*2;}printf("%d\n",count);return0;}逆过程思考问题。8.回文问题回文数是指正读和反读都一样的正整数。例如3773是回文数。求出[1000,9999]之间的回文数是偶数的最大回文数。intmain(){inta1,b1,a2,b2,i,hws;for(i=1000;i<=9999;i++){a1=i/1000;//千位b1=i/100-a1*10;//百位b2=i/10-a1*100-b1*10;//十位a2=i%10;//个位if((a1==a2)&&(b1==b2)&&(i%2==0))hws=i;}printf("所求的最大回文数为:%d",hws);return0;}当然这里是题目简单只有四位数,万一位数不确定呢?大家可以思考思考,在评论区中讨论。9.二维数组一个14*14方阵A(i,j),其每个元素的值为该元素下标的平方和,求出该矩阵所有对角线元素的累加和(注:i,j从1到14)。简单模拟即可。intmain(){longa[15][15];longi,j,sum=0;for(i=1;i<15;i++)for(j=1;j<15;j++)a[i][j]=i*i+j*j;for(i=1;i<15;i++)sum=sum+a[i][i];printf("%ld",sum);return0;}10.结构体问题有5个学生,每个学生的数据包括学号、姓名、2门课程的成绩,从键盘输入5个学生数据,要求输出5个学生2门课程总平均成绩。structstudent{charno[5];charname[8];intscore[2];};intmain(){studentrecord[5];inti,sum=0,j,ave;printf("Pleaseinput5studentsscore:");for(i=0;i<5;i++){printf("Pleaseinput%dnumber:",i+1);printf("enternumber:");scanf("%s",record[i].no);printf("entername:");scanf("%s",record[i].name);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论