POJ1002 487-3279 WA了好几回 TUT

来源:互联网 发布:手机淘宝商品图片尺寸 编辑:程序博客网 时间:2024/05/16 01:00

1002题描述了为了便于记忆,经常将电话号码(数字)转换成英文字母,由于英文字母和数字是多对一的关系,因此不同的表示可能代表的是同一个电话号码,此题给一定个数的电话号码,要求将任何号码转换成统一的格式,统计同样的号码出现的次数,如果转换后有相同的号码,按照XXX-XXXX的格式输出7位数字,后面跟上出现次数,如果没有重读的,则输出No duplicates.

我想说此题真是坑啊,巨坑!花了我两天时间才找到为啥错了,思想方法倒不难,先读入数据转换成数字字符串存入,然后排序,最后统计输出。但是数据量太大,开始开的数组大小为100001*9的,一提交就是WA、WA。我急了,测试的数据全都过了,几经周折,找到了原题的测试数据,当输入12个、甚至1000个程序都没有问题,统计结果仍然相同,但是都数据量到达10万的时候,就会出现错误,测试了几组10W个的数据,错误都在我统计结果的最后几十条。终于,想到了是不是我数组开小了,换成101000*9后,果然自己机器上跑的结果终于正确了。

但是!我拿这个程序提交时,竟然又是WA,真是觉得见鬼了,后来换成C编译器才好了。真是奇怪,我自己就是用的GCC编译器,提交就是WA,最后再将数组开到110000*9后终于GCC也过了,对此我觉得是不是我用的的GCC的版本问题,是不是编译器优化过了,相比poj上的编译器效率更高呢?

#include<stdio.h>#include<string.h>#include<stdlib.h>int strComp(const void *a, const void *b){     return strcmp((char*)a, (char *)b);}void main(){int number,i=0,j,m,count=0,l,flag=0;char s[100];char c[101000][9];    int p[101000];    memset(c,'\0',sizeof(c));scanf("%d",&number);while( count < number && number<=100000){memset(s,'\0',sizeof(s));scanf("%s",s);getchar();l=strlen(s);for(j=0,m=0;m<l;m++){if(j==3){c[i][j]='-';j++;}if(s[m] == '-')continue;if(s[m]>=65 && s[m]<90){switch(s[m]){case 'A': case 'B': case 'C':c[i][j]='2';break;case 'D': case 'E': case 'F':c[i][j]='3';break;case 'G': case 'H': case 'I':c[i][j]='4';break;case 'J': case 'K': case 'L':c[i][j]='5';break;case 'M': case 'N': case 'O':c[i][j]='6';break;case 'P': case 'R': case 'S':c[i][j]='7';break;case 'T': case 'U': case 'V':c[i][j]='8';break;case 'W': case 'X': case 'Y':c[i][j]='9';break;default:break;}}else{c[i][j]=s[m];}            j++;}        i++;count++;}    qsort(c[0],number,9,strComp);    memset(p,0,number);for(i=0;i<number-1;i++){            m=i;            p[i]++;while(strcmp(c[i],c[i+1])==0){                p[m]++;                flag=1;                i++;            }            if(flag==1){                printf("%s %d\n",c[i-1],p[m]);                flag=2;            }}    if(flag==0)        printf("No duplicates.\n");}