输入n个朋友的信息,包括姓名、生日、电话号码,本题要求编写程序,按照年龄从大到小的顺序依次输出通讯录。题目保证所有人的生日均不相同。
哪里错了,PTA显示运行超时
#include<stdio.h>
struct frd {
char name[10];
int num[8];
char phone[17];
};
int main()
{
int flag,j,k,i,N;
struct frd t;
scanf("%d",&N);
struct frd pengyou[N];
for (i=0;i<N;i++)
{
scanf("%s%d%s",&pengyou[i].name,&pengyou[i].num,&pengyou[i].phone);
}
for (i=0;i<N;i++)
{ k=i;
flag=0;
for (j=0;i<N;j++)
{if (pengyou[j].num<pengyou[k].num)
{k=j;flag=1;}}
if (flag==1)
{
t=pengyou[i];
pengyou[i]=pengyou[k];
pengyou[k]=t;
}}
for(i=0;i<N;i++)
{
printf("%s%d%s",pengyou[i].name,pengyou[i].num,pengyou[i].phone);}
return 0;
}
我知道了,你用的选择排序,时间复杂度为O(n*n)
【以下回答由 GPT 生成】
首先,我们需要检查代码中的错误和潜在问题。在代码中,有几个问题需要解决:
num
成员应该是一个整数数组,而不是一个单独的整数。我们需要将num
声明为int num[8]
。%d
格式来读取整数数组成员,而不是%d
。同样,%s
应该用于读取字符串成员。for
循环中的循环条件错误。应该是j<N
,而不是i<N
。flag
的值,以便在找到更小的年龄时进行交换。改进后的代码如下:
#include<stdio.h>
struct frd {
char name[10];
int num[8];
char phone[17];
};
int main()
{
int flag, j, k, i, N;
struct frd t;
scanf("%d", &N);
struct frd pengyou[N];
for (i=0; i<N; i++)
{
scanf("%s", pengyou[i].name);
for (j=0; j<8; j++)
{
scanf("%d", &pengyou[i].num[j]);
}
scanf("%s", pengyou[i].phone);
}
for (i=0; i<N; i++)
{
k=i;
flag=0;
for (j=i+1; j<N; j++)
{
if (pengyou[j].num[0] > pengyou[k].num[0])
{
k=j;
flag=1;
}
}
if (flag==1)
{
t=pengyou[i];
pengyou[i]=pengyou[k];
pengyou[k]=t;
}
}
for(i=0; i<N; i++)
{
printf("%s ", pengyou[i].name);
for (j=0; j<8; j++)
{
printf("%d", pengyou[i].num[j]);
}
printf(" %s\n", pengyou[i].phone);
}
return 0;
}
请注意,这里仅根据代码本身提供的信息进行了改进。可能还有其他优化方案,但我们需要更多信息来针对性地优化。如果代码仍然存在性能问题,可能需要进一步分析算法和数据结构,并根据具体问题进行优化。
【相关推荐】
主要两处有问题,第一处是第4行电话号码定义 int num[8]; 是有误的,这里不需数组。第二处是第20行: for (j=0;i<N;j++) 里 i < N 是错误的,这里的循环因子是 j 。整体修改如下,改动处见注释,供参考:
#include <stdio.h>
#define N 50 // 修改
struct frd {
char name[10];
int num; //int num[8]; // 修改
char phone[18]; //char phone[17]; 修改
};
int main()
{
int flag, j, k, i, n; // 修改
struct frd t, pengyou[N]; // 修改
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%s %d %s", &pengyou[i].name, &pengyou[i].num, &pengyou[i].phone);
}
for (i = 0; i < n; i++)
{
k = i;
flag = 0;
for (j = i + 1; j < n; j++) //for (j = 0; i < n; j++) 修改
{
if (pengyou[j].num < pengyou[k].num)
{
k = j; flag = 1;
}
}
if (flag == 1)
{
t = pengyou[i];
pengyou[i] = pengyou[k];
pengyou[k] = t;
}
}
for (i = 0; i < n; i++)
{
printf("%s %d %s\n", pengyou[i].name, pengyou[i].num, pengyou[i].phone);
//printf("%s%d%s", pengyou[i].name, pengyou[i].num, pengyou[i].phone);
}
return 0;
}
你这个排序算法需要改一改。
看看是不是输入格式不对,你的程序本身不会超时,没有死循环,可能是输入卡了。