NEFU锐格实验七[动态数组]
知识点
题目 | 知识点 |
---|---|
5859 | 约瑟夫问题,一维动态数组建立与赋值 |
5860 | 动态开辟多个字符串数组 |
5861 | 动态开辟结构体数组 |
5862 | 重新分配内存,字符串处理 |
题目
如果不会写动态数组可以参考一下这个博客
5859
约瑟夫环很经典,也有很多解法,这里把t出多少人改为剩余多少人,这样免去最后循环遍历,当然这样做并非最高效解法(比如数学解法),不过或许更符合教学要求一些
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n,m,cnt=0;
int *p=NULL;
while(~scanf("%d%d",&n,&m)&&(n||m))//写成(n||m)简单些
{
int last=n;//剩余人数
p=(int *)calloc(n,sizeof(int));//开动态数组
for(int i=0;i<n;i++)
*(p+i)=1;
while(last>=1)
{
for(int i=0;i<n;i++)
{
if(*(p+i))//没出局的,可以报数的人
{
++cnt;
if(cnt==m)//出局
{
*(p+i)=0;
cnt=0;
last--;
}
}
if(last==0)
{
printf("%d\n",i);
break;
}
}
}
free(p);//释放第一维指针,看到一些博客说,这样更好,防止内存泄漏
p=NULL;//重置为空指针防止出现野指针
}
return 0;
}
5860
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int n,max=0,maxi;
char (*p)[100];//指向含100个char类型元素的数组的 指针变量
while(~scanf("%d",&n))
{
getchar();
p=(char(*)[100])calloc(n,sizeof(char[100]));//动态开辟n个字符串
for(int i=0;i<n;i++)
{
gets(p[i]);
if(strlen(p[i])>max)
{
max=strlen(p[i]);
maxi=i;
}
}
printf("%s\n",p[maxi]);
free(p);//释放
p=NULL;
}
return 0;
}
5861
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
typedef struct
{
double x,y;
}Point;
int main()
{
int n;
Point *p;
while(~scanf("%d",&n))
{
p=(Point *)calloc(n,sizeof(Point));
for(int i=0;i<n;i++)
scanf("%lf%lf",&(*(p+i)).x,&(*(p+i)).y);
double min=999999999.9;
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
{
double len=pow(p[i].x-p[j].x,2)+pow(p[i].y-p[j].y,2);
min=len<min?len:min;
}
printf("%.1lf\n",sqrt(min));
free(p);
p=NULL;
}
return 0;
}
5862
这题我动态写得比较懵逼hh,等老师讲了我再看看吧,这个写法不一定符合这章的要求,将就看吧
总之我写的这玩意还有很多不大对劲的地方,先码了再说
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int n,cnt=0,len=0;
char *s;//读入段落
char (*p)[50];//存单词
char tmp[50];//临时存一个完整单词
s=(char *)malloc(1005*sizeof(char));
gets(s);
p=(char(*)[50])calloc(1,sizeof(char[50]));
//A:这个写成p=(char(*)[50])calloc(0,sizeof(char[50])),不知道为什么也可以
int flag=0;//主要防止连续空格这种
for(int i=0;s[i];++i)
{
if(s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]<='Z'||s[i]=='.'||s[i]==';')
{
tmp[len++]=s[i];
flag=1;
}
else if(flag)
{
strcpy(p[cnt],tmp);
memset(tmp,0,sizeof tmp);
len=0;
flag=0;
p=(char(*)[50])realloc(p,(cnt+2)*sizeof(char[50]));//B:重新分配内存,当然你也可以猛一些开两倍什么的貌似c++vector就是这样的,有个问题是,把这行注释掉好像也没问题?
cnt++;
}
}
if(len)strcpy(p[cnt++],tmp);//处理最后一个
printf("%d\n",cnt);
for(int i=0;i<cnt;i++)
printf("%s\n",p[i]);
free(p);free(s);//C:不知道为啥,如果上面那个p重新分配内存写cnt+1,free后会报runtime error
p=NULL;s=NULL;
return 0;
}
对于问题A的资料,BC待解
https://blog.csdn.net/sinat_35297665/article/details/78925121
https://www.zhihu.com/question/21570597
https://www.cnblogs.com/csdndreamer/p/5490680.html