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).后来发现,是写错地方了。
#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;
}
(这题不难,只是觉得这种做法以后某个题会有出乎意料的用途,(见识短浅的小白直觉))