题目2021.12.2

 

目录

1. 成绩排名(pta)

1.1 题目描述

 1.2 代码实现

1.3 反思(关于字符串数组越界)

2.素数对猜想

2.1 题目描述

2.2 代码实现

 2.3 反思

3. 简化的插入排序(oj) 

3.1 题目描述

 3.2 代码实现

3.3 反思

4.递归找公约数

4.1 题目描述

 4.2 递归 思路

4.3 代码实现


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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值