同一个程序,多次输出结果不同,请大佬帮忙

shayue111 2018-03-01 01:16:10

#include <stdio.h>
#include <stdlib.h>
typedef struct mouse{
int rank,fat;
}Mouse;
int compare(const void *a,const void *b){
return (((const Mouse*)b)->rank-((const Mouse*)a)->rank);
}
int main() {
int N,k,level_cnt,level[1001]={0};
scanf("%d %d",&N,&k);
if(N%k==0) level_cnt=N/k;
else level_cnt=N/k+1;
int *queue=(int*)malloc(sizeof(int)*N);
int *a=(int*)malloc(sizeof(int)*N);
Mouse *ans=(Mouse*)malloc(sizeof(Mouse)*N);
for(int i=0;i<N;i++){
scanf("%d",&ans[i].fat);
a[i]=ans[i].fat;
}
int rear=0,current=N;
while(rear<N){
int t;
scanf("%d",&t);
queue[rear++]=ans[t].fat;
}
int i=0,j;
while(1){
int max=-1;
if(i+k<=current){
for(j=i;j<i+k;j++){
if(queue[j]>max)
max=queue[j];
level[queue[j]]++;
}
queue[rear++]=max;
i=i+k;
}else{
for(j=i;j<current;j++){
if(queue[j]>max)
max=queue[j];
level[queue[j]]++;
}
queue[rear++]=max;
i=j;
}
if(level[max]==level_cnt) break;
if(j==current){
current=rear;
}
}
for(int l=0;l<N;l++){
ans[l].rank=level[ans[l].fat];
printf("%d ",ans[l].rank);
}
printf("\n");
qsort(ans, N, sizeof(Mouse), compare);
for(int l=0;l<N;l++){
printf("%d ",ans[l].rank);
}
printf("\n");
for(int l=0;l<N;l++){
if(l==0){
level[ans[0].fat]=1;
}else{
int m=l;
while(ans[m].rank==ans[m-1].rank)
m--;
level[ans[l].fat]=m+1;
}
}
for(int l=0;l<N;l++){
if(l==0)
printf("%d",level[a[l]]);
else
printf(" %d",level[a[l]]);
}
free(ans);
free(a);
free(queue);
return 0;
}



最后一张答案正确,主要是为了输出倒数第三行的正确排名。
...全文
531 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
flying_music 2018-03-01
  • 打赏
  • 举报
回复
没读懂你的逻辑,但语法上应该是queue分配的空间不够,多分配一些就可以保证语法没问题了,但不保证逻辑没问题
赵4老师 2018-03-01
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
自信男孩 2018-03-01
  • 打赏
  • 举报
回复
代码可读性很差,逻辑不明确。 建议将需求贴出来,以便对照需求看代码或许能看出问题所在。
paschen 2018-03-01
  • 打赏
  • 举报
回复
单步跟踪程序运行,观察变量变化情况,分析原因

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧