2019秋期计导实验八

D. 实验7_8_最长平台

运行时间限制: 1000 运行内存限制: 65536
作者: scshuanghai 是否specialjudge: False
题目描述
给定一个长度为n的整数数组,数组中连续的相等元素构成的子序列称为平台。试设计算法,求出数组中最长平台的长度。
输入与输出要求:首先输入一个整数n,代表数组元素的个数,n不会超过1000。然后是n个整数,每个整数的取值范围是int型范围。输出最长平台的长度,占一行。
程序运行效果:
Sample 1:
15↙
1 1 2 2 4 5 7 7 7 7 7 7 3 3 9↙
6

看了别人的代码,有用两个循环来写的。我坚持走完一个循环,en…花的时间有点多。
下面是我自己写的,重要的还是思路逻辑。

#include<stdio.h>
#include<time.h>
int main()
{
	int n,i,sum=0,t=0;
	scanf("%d",&n);
	//srand(time(NULL));n=1+rand()%10;printf("%d\n",n);
	int a[1000];
	scanf("%d",&a[0]);
	//a[0]=1+rand()%10;printf("%d\n",a[0]);//n等于1时,输出0?*/
	//if(n==1)t=1; 
	for(i=1;i<n;i++)
	{
		scanf("%d",&a[i]);
		//a[i]=1+rand()%10;printf("%d ",a[i]);
		if(a[i]==a[i-1])sum++;
		else {
			if(t<sum)t=sum;//将得到的一个平台赋给一个变量,用于接下来的比较
			sum=0;
		}//最后连续的
		//printf("%d\n",sum);
		//printf("%d\n",t);
		if(i==(n-1)&&a[i]==a[i-1]&&(t<sum))t=sum;//将最后是连续数的情况单列
	}
	printf("%d\n",t+1);//加上连续数最后一个数本身 
	return 0;
}

过题历程是这样的:一开始第0组数据WA,因为忘记注释掉随机数;后来第七组,第四组,终于改对了条件。最后那个“连续到最后”的判断,以及无连续平台输1.
这题最纠结的是一个点:没有连续数是输出1还是输出0?
我一开始理解,这既然是输出连续平台的数个数,没有不就是0吗,后来输出1才全部过了数据。。

B. 实验7_2_数组查找

运行时间限制: 1000 运行内存限制: 65536
作者: scshuanghai 是否specialjudge: False
题目描述
有n个互不相同的整数,存储在数组中。在这n个整数中查找m个整数,如果存在,则打印出与之相邻的整数;否则就显示无此数。
输入与输出要求:首先输入一个整数n以及n个整数(n的范围是1—1000),然后输入整数m,代表查询次数(m的范围是1—100),接着输入m个待查询的数。输出m行查询的结果,每次的查询结果中可能有一个数、两个数或没有数。若没有数则输出“NULL”。
程序运行效果:
Sample 1:
5↙
89 7890 22 56 87↙
6↙
89 7890 22 56 87 999↙
7890
89 22
7890 56
22 87
56
NULL

这题思路很简单:两组数分别用数组存起来,在其中一个中寻找属于另一个数组的元素。甚至不用等第二组完全存好,在输入第二组的时候就可以搜索。

这题主要出现了以下问题:
1、数组越界造成的运行时错误,具体来讲是在限制输出条件那里。如下图,在没有画叉的地方的时候,只有选出来的那部分会运行时错误,在这里插入图片描述需要限制i-1>=0在这里插入图片描述
于是,没有画叉的地方的AC版代码是:
(请忽略//部分,那是我在找bug时,写出来的,之后改正成现在这样)

#include<stdio.h>
#define SIZE 1001
int n,a[SIZE];
void search(int x)
{
	/*if(n==1){
		printf("NULL\n");
		return 0;//void不支持return 0 
	}*/
	int i,flag=0;
	for(i=0;i<n;i++)
	{
		if(x==a[i]){//存在越界问题 
			if((i+1<n)&&(i==0))printf("%d\n",a[i+1]);//首位是搜索要找的数//为啥只有一个数 会输出0? 
			else if((i-1>=0)&&(i-1<n)&&(i==n-1))printf("%d\n",a[i-1]);//末位是
			else if((i-1>=0)&&(i-1<n)&&(i+1<n))printf("%d %d\n",a[i-1],a[i+1]);
			else printf("NULL\n"); 
			flag=1;
			break;
		}
	}
	if(flag==0)printf("NULL\n");
}
int main()
{
	int m,b[SIZE],i;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);//不让输完,会有运行时错误? 
	}
	scanf("%d",&m);
	for(i=0;i<m;i++)
	{
		scanf("%d",&b[i]);
		search(b[i]);
	}
	
	return 0;
}

2、题目没看清,1000的范围,我就开了个101的数组(此处应有一个捂脸的表情包),也是运行时错误
3.不让数据输完也是运行时错误,我一开始想,既然一个数的数组怎么都是NULL,不如独立写出来,于是我收获了第0组数据没过,并且显示运行时错误。如下图(3).后来发现,是写错地方了。
图3

#include<stdio.h>
#define SIZE 1001
int n,a[SIZE];
int search(int x)
{
	if(n==1){
		printf("NULL\n");
		return 0;
	}
	int i,flag=0;
	for(i=0;i<n;i++)
	{
		if(x==a[i]){//存在溢出问题 
			if((i+1<n)&&(i==0))printf("%d\n",a[i+1]);//首位是要寻找的元素的情况 //为啥只有一个数 会输出0? 
			else if((i-1<n)&&(i==n-1))printf("%d\n",a[i-1]);//末位是要寻找的元素的情况  //如果n等于1,这条就满足 
			else if((i-1<n)&&(i+1<n))printf("%d %d\n",a[i-1],a[i+1]);
			else printf("NULL\n"); 
			flag=1;
			break;
		}
	}
	if(flag==0)printf("NULL\n");
}
int main()
{
	int m,b[SIZE],i;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]); 
	}
	scanf("%d",&m);
	for(i=0;i<m;i++)
	{
		scanf("%d",&b[i]);
		search(b[i]);
	}
	
	return 0;
}

在这里插入图片描述
想找找有木有大佬有其他方法,然鹅发现另两位博主和我题目不一样,他们要用指针。。并且还不加任何说明。。

C. 实验7_3_奇数偶数

运行时间限制: 1000 运行内存限制: 65536
作者: scshuanghai 是否specialjudge: False
题目描述
已知一个长度为n的整数数组,在保证原顺序的前提下,将该数组中所有的偶数放到所有的奇数之前,存到一个新数组中,并将新数组输出。
输入与输出要求:首先输入一个整数n,代表输入整数个数(n的范围是1—200)。然后输入n个整数,每个整数的取值范围是int型范围。输出新数组中的元素,数与数之间用空格分开,第n个数后是换行符。
程序运行效果:
10↙
3 9 4 5 8 7 10 2 6 1↙
4 8 10 2 6 3 9 5 7 1

又一个死于越界的题,oj告诉我答案错误,在写了随机数也不能找出错误之后,我开始想边界值,比如只有1个数,事实证明,的确是在这里找到了逻辑bug。
输入奇数的时候,没毛病
在这里插入图片描述
输入偶数就有毛病了,后来发现时没有奇数时,回车输不了,并且,ji[k-1]越界。
在这里插入图片描述
更改后如下

#include<stdio.h>
#include<time.h>
#define SIZE 201 
int main()
{
	int ou[SIZE],ji[SIZE],n,i,t,j=0,k=0,xin[SIZE];
	scanf("%d",&n);
	//srand(time(NULL));n=1+rand()%10;printf("%d\n",n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&t);
		//t=rand();printf("%d\n",t);
		if(t%2==0)ou[j++]=t;
		else ji[k++]=t;
	}
	for(i=0;i<j;i++)printf("%d ",ou[i]);
	for(i=0;i<k-1;i++)printf("%d ",ji[i]);
	if((k-1)>=0)//原来没有加这个判断条件
	printf("%d\n",ji[k-1]);//没有奇数怎么回车? 
	else printf("\n");
	return 0;
}

E. 实验7_9_发工资

运行时间限制: 1000 运行内存限制: 65536
作者: scshuanghai 是否specialjudge: False
题目描述
每到月底,公司就要给员工发工资。每个员工的工资都是由(100,50,20,10,5,2,1) 7种面值的钞票组成的。为了发工资的简便,公司会尽量给员工发较大面值的钞票,例如某个员工的工资为1260,那么公司会给员工12张100元的、1张50元的、1张10的钞票。你的任务是,告诉你某员工的工资,你来计算如何给员工发工资。
输入与输出要求:首先输入一个正整数n(可以用int存储),代表某位员工的工资。输出给该员工发的钞票面值与数量。
程序运行效果:
Sample 1:
1201↙
100:12
1:1
Sample 2:
2352↙
100:23
50:1
2:1

#include<stdio.h>
#define SIZE 7
int main()
{
	int a[SIZE]={100,50,20,10,5,2,1},n,i;
	scanf("%d",&n);
	for(i=0;i<7;i++)
	{
		if(n>=a[i])
		{
			printf("%d:%d\n",a[i],n/a[i]);
			n=n%a[i];
			//printf("%d\n",n);
		}
		//else continue;
	}
	return 0;
} 

(这题不难,只是觉得这种做法以后某个题会有出乎意料的用途,(见识短浅的小白直觉))

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值