在poj做题时 超时了 求大神们看一下怎么可以优化一下
在poj刷题 出现超时 求大神们看看我的算法哪里可以优化一下
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
int count;
int count2=1;
scanf("%d",&count);
int i;
int j;
int right=0;
char h[9];
char* change(char*);
char a[100][20];
char b[100][9];
for(i=0;i<count;i++)
{
scanf("%s",a[i]);
strcpy(b[i],change(a[i]));
}
for(i=0;i<count-1;i++)
for(j=i+1;j<count;j++)
{
if(strcmp(b[i],b[j])>0)
{
strcpy(h,b[i]);
strcpy(b[i],b[j]);
strcpy(b[j],h);
}
}
for(i=0;i<count;)
{
if(strcmp(b[i],b[i+1])==0)
{
i++;
count2++;
right=1;
}
else
{
if(right==1)
{
if(count2!=1)
{
printf("%s %d\n",b[i],count2);
count2=1;
}
}
else if(right==0)
{
printf("No duplicates.");
i=count;
}
}
}
return 0;
}
char* change(char* a)
{
int count=0;
int i=0;
char b[9];
char *p=b;
for(;*(a+i)!='\0';i++)
{
if(*(a+i)=='-')
{
continue;
}
else if(count==3)
{
b[3]='-';
i--;
count++;
}
else if(*(a+i)>='0'&&*(a+i)<='9')
{
b[count]=*(a+i);
count++;
}
else if(*(a+i)=='A'||*(a+i)=='B'||*(a+i)=='C')
{
b[count]='2';
count++;
}
else if(*(a+i)=='D'||*(a+i)=='E'||*(a+i)=='F')
{
b[count]='3';
count++;
}
else if(*(a+i)=='G'||*(a+i)=='H'||*(a+i)=='I')
{
b[count]='4';
count++;
}
else if(*(a+i)=='J'||*(a+i)=='K'||*(a+i)=='L')
{
b[count]='5';
count++;
}
else if(*(a+i)=='M'||*(a+i)=='O'||*(a+i)=='N')
{
b[count]='6';
count++;
}
else if(*(a+i)=='R'||*(a+i)=='S'||*(a+i)=='P')
{
b[count]='7';
count++;
}
else if(*(a+i)=='T'||*(a+i)=='U'||*(a+i)=='V')
{
b[count]='8';
count++;
}
else if(*(a+i)=='W'||*(a+i)=='X'||*(a+i)=='Y')
{
b[count]='9';
count++;
}
}
b[count]='\0';
return p;
}
还有 我以前在poj是用java写的 现在学习嵌入式 所以想用c语言在poj重新刷一下题 熟悉一下c语言
听说不是用c语言中的指针应该是更快吗 我这个只是把java中的一些输出改成了c语言 算法基本没变 java通过了 C语言为什么反而慢了
[解决办法]
LZ程序超时的主要原因是:
(1)判断部分的程序陷入死循环
(2)排序不够快
还有数组不够大。
如下修改AC:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cmp(const void *a, const void *b)
{
return strcmp((char *)a,(char *)b);
}
int main(void)
{
int count;
int count2=1;
scanf("%d",&count);
int i;
int j;
int right=0;
char h[9];
void change(char*, char*);//char* change(char*);
char a[50];//char a[100][20];
char (*b)[9] = new char[count][9];//char b[100][9];
for(i=0;i<count;i++)
{
scanf("%s",a);//scanf("%s",a[i]);
change(a, b[i]);//strcpy(b[i],change(a[i]));
}
/*
for(i=0;i<count-1;i++)
for(j=i+1;j<count;j++)
{
if(strcmp(b[i],b[j])>0)
{
strcpy(h,b[i]);
strcpy(b[i],b[j]);
strcpy(b[j],h);
}
}
*/
qsort(b, count, sizeof(b[0]), cmp);
for(i=0;i<count;i++)
{
while(i<count-1 && strcmp(b[i],b[i+1])==0)
{
i++;
count2++;
}
if(count2>1)
{
printf("%s %d\n",b[i],count2);
count2=1;
right=1;
}
}
if(right==0)
{
printf("No duplicates.\n");
}
return 0;
}
void change(char* a, char *b)//char* change(char* a)
{
int count=0;
int i=0;
//char b[9];
//char *p=b;
for(;*(a+i)!='\0';i++)
{
if(*(a+i)=='-')
{
continue;
}
else if(count==3)
{
b[3]='-';
i--;
count++;
}
else if(*(a+i)>='0'&&*(a+i)<='9')
{
b[count]=*(a+i);
count++;
}
else if(*(a+i)=='A'
[解决办法]
*(a+i)=='B'
[解决办法]
*(a+i)=='C')
{
b[count]='2';
count++;
}
else if(*(a+i)=='D'
[解决办法]
*(a+i)=='E'
[解决办法]
*(a+i)=='F')
{
b[count]='3';
count++;
}
else if(*(a+i)=='G'
[解决办法]
*(a+i)=='H'
[解决办法]
*(a+i)=='I')
{
b[count]='4';
count++;
}
else if(*(a+i)=='J'
[解决办法]
*(a+i)=='K'
[解决办法]
*(a+i)=='L')
{
b[count]='5';
count++;
}
else if(*(a+i)=='M'
[解决办法]
*(a+i)=='O'
[解决办法]
*(a+i)=='N')
{
b[count]='6';
count++;
}
else if(*(a+i)=='R'
[解决办法]
*(a+i)=='S'
[解决办法]
*(a+i)=='P')
{
b[count]='7';
count++;
}
else if(*(a+i)=='T'
[解决办法]
*(a+i)=='U'
[解决办法]
*(a+i)=='V')
{
b[count]='8';
count++;
}
else if(*(a+i)=='W'
[解决办法]
*(a+i)=='X'
[解决办法]
*(a+i)=='Y')
{
b[count]='9';
count++;
}
}
b[count]='\0';
//return p;
}