目录
1. 成绩排名(pta)
1.1 题目描述
1.2 代码实现
#include<stdio.h>
struct student{
char name[11]; //注意注意!!!
char number[20];
int score;
};
int main(){
int n,i,max=0,min=1000,max_num,min_num;
scanf("%d",&n);
struct student stu[n];
for(i=0;i<n;i++){
scanf("%s %s %d",&stu[i].name,&stu[i].number,&stu[i].score);
if(stu[i].score>=max){
max_num=i;
max=stu[i].score;
}
if(stu[i].score<=min){
min_num=i;
min=stu[i].score;
}
}
printf("%s %s\n",stu[max_num].name,stu[max_num].number);
printf("%s %s\n",stu[min_num].name,stu[min_num].number);
return 0;
}
1.3 反思(关于字符串数组越界)
题目的要求写的是名字和学号都是不超过10字符的数
但是我们在定义的时候 要将数组的大小定义为11
因为他是个字符串 末尾会自动加上'\0'
写成10会有数组越界的问题~
复盘一下步骤
1.定义一个结构体 里面存放一个学生名字和对应的成绩
2.定义一个结构体数组 然后循环将数据存放进数组里
3.用 max 和 min 找出 stu[ ].score 的最大值和最小值对应的序号
4.输出stu[max_number]和stu[min_number]对应数据
2.素数对猜想
2.1 题目描述
2.2 代码实现
#include<stdio.h>
#include<math.h>
int isprime(int n){ /*判断是否为素数*/
int i,ret=1;
if(n==1)ret=0;
if(n!=2&&n%2==0)ret=0;
for(i=3;i<sqrt(n)+1;i+=2){
if(n%i==0){
ret=0;
break;
}
}
return ret;
}
int prime_list(int n,int arr[]){ /*创建一个到n的素数表*/
int i,cnt=0;
for(i=2;i<=n;i++){
if(isprime(i)){
arr[cnt]=i;
cnt++;
}
}
return cnt;
}
int main(){
int n,i,count,cnt=0;
int arr[10000];
scanf("%d",&n);
count=prime_list(n,arr);
for(i=0;i<count+1;i++){
if((arr[i]+2)==arr[i+1]){
cnt++;
}
}
printf("%d\n",cnt);
return 0;
}
2.3 反思
复盘一下步骤
1.做一个判断是否为素数的函数(isprime)
2.定义出一个数组,里面都是素数且最大数字小于n
3.如果a[i]=a[i+1]-2 计数加一
3. 简化的插入排序(oj)
3.1 题目描述
3.2 代码实现
#include <stdio.h>
int main(){
int a[100],n,i,m,t=0;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("%d",&m);
for(i=n;i>0;i--)
{
if(m>=a[i-1])
{
a[i]=m;
t=1; //当m<a[i]时,把a[i]塞到a[i+1]里面,
break; //因为数组有n+1个,不用担心越界的问题
//当m>a[i]时,使得啊a[i+1]=m
}
else
a[i]=a[i-1];
}
if(t==0)
a[0]=m;
for(i=0;i<n+1;i++)
printf("%d ",a[i]);
return 0;
}
3.3 反思
虽然用一个又臭又长的代码过了oj 但确实 又臭又长~
所以上csdn思考了一下别人的代码
在选择插入m的位置的时候
一开始我想的是选择m>a[i]&&am<a[i+1]的位置
但这样有很多麻烦的地方 比如说如果m比数组最后一个数字都大的时候就很麻烦
而且把数组的每个数字都往后推的时候 要选择i+2的位置开始塞前一个数字 也会变得非常复杂
所以 基本上 得换个思路实现它
前提条件:原本的数组就是从小到大排列
从n-1开始循环
当m<a[i]时,把a[i]塞到a[i+1]里面,因为数组有n+1个,不用担心越界的问题
当m>a[i]时,使得啊a[i+1]=m
最后来个遍历就可以实现了
4.递归找公约数
4.1 题目描述
4.2 递归 思路
辗转相除法求最大公约数的方法:
1、先用大的一个数除小的一个数,得第一个余数;
2、再用第一个余数除小的一个数,得第二个余数;
3、又用第二个余数除第一个余数,得第三个余数;
4、这样逐次用后一个数去除前一个余数,直到余数是0为止。最后一个除数就是所求的最4.大公约数。
4.3 代码实现
#include<stdio.h>
int dec(int n,int m){
int ret;
if(n%m==0)ret=m;
else{
ret=dec(m,n%m);
}
return ret;
}
int main(){
int n,m,i,num,t;
scanf("%d %d",&n,&m);
if(n<m){t=n;n=m;m=t;}
printf("%d",dec(n,m));
return 0;
}