POJ1002 487-3279 WA了好几回 TUT

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");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值