20级大数据1班第七次堂测题解
20级大数据1班第七次堂测题解
这次堂测的题目比较综合,而且有点难度,所以希望同学们能好好理解
1 偶数与质数
考点:如何判断一个数为素数
思路:运用循环和判断找出符合条件的两个素数找
8
输出样例3 5
完整代码#include <stdio.h> #include <string.h> #include <math.h> int main() { int n,i,j,k; scanf("%d",&n); for(i=2; i<n; i++)//运用循环从2开始依次判断是否为素数 { int x1=sqrt(i);//判断i是否为素数 for(j=2; j<=x1; j++) { if(i%j==0) break; } if(j>x1)//找到素数i后,判断n-i是否也为素数 { int x2=sqrt(n-i); for(k=2; k<=x2; k++) { if((n-i)%k==0) break; } if(k>x2)//若都为素数,则打印这两个素数 { printf("%d %d",i,n-i); return 0; } } } }
123456789101112131415161718192021222324252627282930312 多个数的最大公约数
考点:判断一个数是否为公约数
思路:因为有多个数,所以运用数组将数字存储,然后运用循环和判断条件找到最大公约数
3
12 18 42
6
#include <stdio.h> #include <string.h> #include <math.h> int main() { int n,i,j,a[10],flag=0; scanf("%d",&n); for(i=0; i<n; i++) scanf("%d",&a[i]);//运用数组存储数字 int min=a[0]; for(i=1; i<n; i++) { if(a[i]<=min) min=a[i]; }//找到这些数字中的最小值 for(i=min; i>=1; i--)//从最小值开始逐渐递减,看是否为公因数 { for(j=0; j<n; j++) { if(a[j]%i!=0)//若存在一个数不能整除i,则i不是公因数 { flag=0; break; } else if(a[j]%i==0) flag=1; } if(flag)//若flag=1,说明已经找到最大公因数,打印并跳出循环即可 { printf("%d",i); break; } } }
123456789101112131415161718192021222324252627282930313233343 Z型数字矩阵(改错题)
这道题需要同学们根据已有的代码,理清循环条件和矩阵行数与列数的关系,难度比较高,尽量理解就好,答案不作解释,请同学们自习理解,这样才能加深印象
题目要求3
输出样例1 2 6
3 5 7
4 8 9
$block1$if(m<n&&m%2==0) x=m-j; else if(m<n&&m%2!=0) x=j; else if(m>=n&&m%2==0) x=m-i-j; else if(m>=n&&m%2!=0) x=m+j-n+1; y=m-x; a[x][y]=count++; $end1$ 123456789101112 完整代码
#include "stdio.h" #include "math.h" #include "stdlib.h" int main() { int a[20][20], n, i, j, m=0, x, y, temp, count=1; scanf("%d", &n); for(i=-(n-1);i<=n-1;i++) { for(j=0;j<n-abs(i);j++) { /*******************Error**********************if(m<n)x=m-j; elsex=n-1-j; y=m-x; a[x][y]=count++; ********************Error*********************/ //不作解释,请同学们自行理解 if(m<n&&m%2==0) x=m-j; else if(m<n&&m%2!=0) x=j; else if(m>=n&&m%2==0) x=m-i-j; else if(m>=n&&m%2!=0) x=m+j-n+1; y=m-x; a[x][y]=count++; } m++; } for(i=0; i<n; i++) { for(j=0; j<n; j++) printf("%3d", a[i][j]); printf("n"); } }
12345678910111213141516171819202122232425262728293031323334353637384 数字的全排列
该题目难度十分的高,总结方法,理清思路最重要。
题目要求3
输出样例1,2,3
1,3,2
2,1,3
2,3,1
3,1,2
3,2,1
#include <stdio.h> #define max 10 void sort(int a[],int n,int s,int r[],int m);//先定义函数 int main() { int n,a[max],i; int r[max]; scanf("%d",&n); for(i=0; i<n; i++) a[i]=i+1; sort(a,n,0,r,n); return 0; } void sort(int a[],int n,int s,int r[],int m) //其中m表示排列数字的个数,整个递归过程不发生改变; { //其实条件中的s是r数组的下标,r[s]存储递归每次取出的那个元素; int i,j; //开始在该行定义了l=0;错误;导致下边的第一个for循环在第二次循环时还保留第一次了的值,必须每次保证清零; int flag=0; int b[max]; for(i=0; i<n; i++) //该循环将数组中的第i个元素存入数组r中; { flag=1; //确定函数的范围是否到达该输出的时候; r[s]=a[i]; int l=0; for(j=0; j<n; j++) //该循环的目的是将剩下的元素放入一个新数组中,方便下次递归运用; { if(i!=j) { b[l]=a[j]; l++; } } sort(b,n-1,s+1,r,m); } if(flag==0) { int k; for(k=0; k<m; k++) { if(k!=m-1) printf("%d,",r[k]); else printf("%d",r[k]); } printf("n"); } }
12345678910111213141516171819202122232425262728293031323334353637383940414243444546475 三角形旋转(改错题)
对一个二维数组顺时针旋转的方法
1.沿主对角线对称位置上的元素进行交换
2.对一维数组而言,将每一行第i个元素与第N-i-1个元素进行交换
对一个二维数组逆时针旋转的方法
1.沿主对角线对称位置上的元素进行交换
2.将每一列第i个元素与第N-i-1个元素进行交换
3
1
23
456
90
421
53
6
$block1$for(i = 0; i < n; i++) for(j = 0; j < n; j++) b[j][n-1-i]=a[i][j]; $end1$ $block2$for(j=0; j<n; j++) { if(a[i][j]==0)//判断是否需要打印空格 printf(" "); else printf("%c",a[i][j]); } $end2$ 1234567891011121314 完整代码
#include <stdio.h> #include <stdlib.h> char a[20][20]= {0}; char b[20][20]= {0}; int main() { int i,j,n,w,t; scanf("%d", &n); for(i=0; i<n; i++) scanf("%s", a[i]); scanf("%d", &w); w=(w%360)/90; for(t=0; t<w; t++) { for(i = 0; i < n; i++) for(j = 0; j < n; j++) b[j][n-1-i]=a[i][j]; for(i = 0; i < n; i++) for(j = 0; j < n; j++) a[i][j] = b[i][j]; } for(i=0; i<n; i++) { for(j=0; j<n; j++) { if(a[i][j]==0) printf(" "); else printf("%c",a[i][j]); } printf("n"); } return 0; }
123456789101112131415161718192021222324252627282930313233343536376 综合实验: 学生成绩管理
难点:
1、数据比较多,数据复杂
2、要根据学生成绩将学生整体信息排序
解题思路:
1、看到这类型的题目,就应该想到用结构体做,因为要将一个学生看成一个整体,进行排序,虽然二维数组也可以实现这个过程,但是不如结构体自然。
2.确定用结构体后,再梳理整个程序的思路,首先要读入数据,然后分别算出各学生的总分和各科目的平均分,接着根据总分将学生排序,最后输出数据
5 3
90 70 75
89 67 78
87 65 98
97 86 77
88 96 82
88 96 82
97 86 77
87 65 98
90 70 75
89 67 78
90.2 76.8 82
#include <stdio.h> #include <stdlib.h> struct student { int screo[11]; }; typedef struct student DEG; int main() { DEG stu[1005],t; int i,j,n,m,sum[20],t1; double ave[20]; scanf("%d%d",&n,&m); for (i=0;i<n;i++) { for(j=0;j<m;j++) //读入数据 { scanf("%d",&stu[i].screo[j]); //注意结构体的使用 sum[i]+=stu[i].screo[j]; } } for (i=0;i<m;i++) //注意m,n的使用 { for (j=0;j<n;j++) { ave[i]+=stu[j].screo[i]; } ave[i]/=n; //算出平均分 } for (i=0;i<n-1;i++) //冒泡排序 { for (j=0;j<n-1-i;j++) { if (sum[j]<sum[j+1]) //交换学生信息的同时还要交换总分 { t=stu[j]; stu[j]=stu[j+1]; stu[j+1]=t; t1=sum[j]; sum[j]=sum[j+1]; sum[j+1]=t1; } } } for (i=0;i<n;i++) //输出数据 { for (j=0;j<m;j++) { printf("%d ",stu[i].screo[j]); } printf("n"); } for (i=0;i<m;i++) printf("%.1lf ",ave[i]); return 0; }
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859607 阶乘中的零
该题目是个算法类,需要知道规律才能进行
这里有一篇博客专门讲了该如何计算阶乘后零的个数
https://blog.csdn.net/Z_sea/article/details/80160098
同学们可以去学习一下
6
3
60
100
1024
23456
8735373
0
14
24
253
5861
2183837
#include <stdio.h> #include <stdlib.h> int F(int x) { if(x<5)return 0; else if(x>=5) return F(x/5)+x/5; } int main() { int a,i; scanf("%d",&a); int b[a]; for(i=0;i<a;i++)scanf("%d",&b[i]); for(i=0;i<a;i++)printf("%dn",F(b[i])); return 0; }
123456789101112131415161718192021228 幸运的数
思路:从最低位开始判断每一位是否是4或者8,如果是8,则继续判断下一位,如果是4,就可以不需要继续判断了,直接跳出循环
题目要求#include <stdio.h> #include <string.h> #include <math.h> int main() { int i,flag1=0,flag2=1,a,t;//flag1判断是否有8,flag2判断是否存在4 for(i=8;i<=998;i++) { flag1=0; flag2=1; t=i; while(t!=0) { a=t%10; if(a==8) flag1=1; if(a==4) { flag2=0;//若存在4,flag2=0,并跳出循环 break; } t=t/10; } if(flag1==1&&flag2==1) printf("%dn",i); } }
12345678910111213141516171819202122232425262728本次考试链表的题目比较简单,都是书本上的基本知识,只要理解了链表的结构,就可以做出来。但是可能同学们大多还没有理解链表是啥,先理解,再重复运用,熟能生巧。
理解链表可以参考理解数组,其不同点是
1、存储方式:数组在内存中是一段连续的空间,而链表以结点的形式分散存储。
2、读取方式:数组以下标灵活读取数组中的变量,但是链表只能单方向的读取结点中的内容。3、创建方式:创建数组仅仅需要“数组名【】”的形式就可以,但是创建一个链表需要定义一个结构体,创建一个函数,一个一个的将开辟内存空间再将数据读入。但链表的优势在于可以存储若干数量和种类的数据,并且可以节省内存空间。
链表其实就是这么一回事,如果不能很好理解的话,就多打代码,对照着课本的例题,先模仿,多重复打几次,仅有的几个操作无非就是增删查改。“无他,唯手熟尔”。
9 [填空题]链表结点指定位置插入
1、看见题目后,发现是个填空题,这个题目非常友好,链表的创建、输出已经帮我们编好了,观察主函数,流程是:创建链表——打印已创建链表——输入待插入结点信息、插入位置——插入结点——打印新链表。
2、我们所要做的步骤就是插入结点,思路是:遍历链表直到插入位置n,待插入结点指向原来n位置结点所指向的结点,n位置前的结点指向待插入结点
下面程序,先创建一个链表,然后创建一个新结点stu,并调用putinto函数,将新结点插入到第m个结点前(注意,如果m<=1表示插在表头;m>链表结点数表示插在表尾),但putinto未完成,请补充完整。
输入样例3
1
98
7
99
5
87
6
78
2
1 98 7 99 5 87 1 98 6 78 7 99 5 87 1234567 完整代码
#include "stdio.h" #include "malloc.h" #define LEN sizeof(struct student) struct student { long num; int score; struct student *next; }; struct student *creat(int n) { struct student *head=NULL,*p1=NULL,*p2=NULL; int i; for(i=1;i<=n;i++) { p1=(struct student *)malloc(LEN); scanf("%ld",&p1->num); scanf("%d",&p1->score); p1->next=NULL; if(i==1) head=p1; else p2->next=p1; p2=p1; } return(head); } void print(struct student *head) { struct student *p; p=head; while(p!=NULL) { printf("%8ld%8d",p->num,p->score); p=p->next; printf("n"); } } //题目要求填写的地方 struct student *putinto (struct student *head, struct student *stu , int n) { struct student *p; int i; p=head; for (i=1;i<(n-1)&&p!=NULL;i++)//直到n的前一个结点 { p=p->next; } stu->next=p->next; p->next=stu; return head; } // main() { struct student *head,*stu; int n, m; scanf("%d",&n); head=creat(n); print(head); stu=(struct student *)malloc(LEN); scanf("%ld",&stu->num); scanf("%d",&stu->score); stu->next = NULL; scanf("%d", &m); head=putinto (head, stu, m); print(head); }
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768这个程序无法插入到第一个结点处,不过OJ系统过了,应该是题目不考虑插入第一个结点的情况。
10 [填空]链表结点的删除
题目要求:找到结点并删除
解题思路:
1、题目比较友好,跟上一题一样,主体部分都已经给出,只需要自己编写删除结点的函数就行。
2、观察主函数,大家试着自己梳理下。
删除结点思路:让待删除的结点的上一个结点指向待删除结点的下一个结点,但要另外考虑删除第一个结点的情况。
3
1
98
4
99
5
87
4
1 98 4 99 5 87 1 98 5 87 12345 完整代码
#include "stdio.h" #define LEN sizeof(struct student) struct student { long num; int score; struct student *next; }; struct student *creat(int n) { struct student *head=NULL,*p1=NULL,*p2=NULL; int i; for(i=1;i<=n;i++) { p1=(struct student *)malloc(LEN); scanf("%ld",&p1->num); scanf("%d",&p1->score); p1->next=NULL; if(i==1) head=p1; else p2->next=p1; p2=p1; } return(head); } void print(struct student *head) { struct student *p; p=head; while(p!=NULL) { printf("%8ld%8d",p->num,p->score); p=p->next; printf("n"); } } //题目要求填写的地方 struct student *del(struct student *head,long num) { struct student *p,*pre; p=head; while (p!=NULL&&p->num!=num) //注意这里的判断条件是p->!=num,也就是当p->num=num时停下 { pre=p; //记录前一个结点 p=p->next; } if (p==NULL) //排除链表为空的情况 { return head; } else if (p==head) //当需要删除的结点为第一个的情况 { head=head->next; } else { pre->next=p->next; //待删除结点的前一个结点指向待删除结点的后一个结点 } free(p); //释放空间 return head; } // main() { struct student *creat(int n); void print(struct student *head); struct student *delete(struct student *head,long num); struct student *head; int n; long del_num; scanf("%d",&n); head=creat(n); print(head); scanf("%ld",&del_num); head=del(head,del_num); print(head); }
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778本次考试的链表考的不怎么难,都是很基础的题目,把课本的代码自己打几次运行几次就能融汇贯通了,大家得多动手操作!!!!!!这很重要!!!!!!
临近考试,同学们要对做过的题目要多理解,做到融会贯通,考试遇到相似的题目就能迎刃而解!
相关知识
======题解======
菩提道次第广论题解
SPSS前后测数据分析:对比分析方法
大小鼠触觉测痛仪、触觉测痛仪、爪触觉测痛仪品牌:JB
【题解】应急响应靶机训练
猫狗大战题解
【堂良堂+宇宙大甜饼】宠物饲养手册
4399弹弹堂2宠物大曝光 弹弹堂II宠物抢先看
弹弹堂2新版宠物成长规则
利用AI找眼科宠物医院,谁成了大数据赢家?
网址: 20级大数据1班第七次堂测题解 https://www.mcbbbk.com/newsview760082.html
上一篇: LUCKY PET幸运宠物(白云 |
下一篇: 幸运宠物医院 |
推荐分享

- 1我的狗老公李淑敏33——如何 5096
- 2南京宠物粮食薄荷饼宠物食品包 4363
- 3家养水獭多少钱一只正常 3825
- 4豆柴犬为什么不建议养?可爱的 3668
- 5自制狗狗辅食:棉花面纱犬的美 3615
- 6狗交配为什么会锁住?从狗狗生 3601
- 7广州哪里卖宠物猫狗的选择性多 3535
- 8湖南隆飞尔动物药业有限公司宠 3477
- 9黄金蟒的价格 3396
- 10益和 MATCHWELL 狗 3352