北大POJ 1002 试题,本地运行完全正确,可是提交后就出现错误答案,恳求高人相助,谢谢。 15

题目详情求参阅http://poj.org/problem?id=1002思路:边录入边格式电话号码并排序运算,以电话号码首字母分开存储,最后输出。为避免复杂的移动,采用... 题目详情求参阅http://poj.org/problem?id=1002
思路:边录入边格式电话号码并排序运算,以电话号码首字母分开存储,最后输出。为避免复杂的移动,采用链表方式存储。详细程序如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct poj_1002_phone {
char phone[9];
int count;
struct poj_1002_phone *next;
};

char phone_map[]={'2','2','2','3','3','3','4','4','4','5','5,','5','6','6','6','7','x','7','7','8','8','8','9','9','9'};
struct poj_1002_phone *phone_up;
struct poj_1002_phone *phone_this;
struct poj_1002_phone *tmp;

void formatPhone(char*);
void insertPhone(struct poj_1002_phone*,char*,int*);

void main() {
int n,i=0,j,len=0,*exist;
char* phone;
struct poj_1002_phone* book;
book=(struct poj_1002_phone*)malloc(sizeof(struct poj_1002_phone)*10);
exist=(int*)malloc(sizeof(int)*10);
for(;i<10;i++) {
(book+i)->next=NULL;
*(exist+i)=0;
}
scanf("%d",&n);
phone=(char*)malloc(sizeof(char)*80);
for(i=0;i<n;i++) {
scanf("%s",phone);
formatPhone(phone);
j=*phone-48;
insertPhone(book+j,phone,exist+j);
}
j=0;
for(i=0;i<10;i++) {
if(exist[i]) {
j=0;
tmp=book+i;
while((tmp=tmp->next)!=NULL) {
if(n=tmp->count) {
printf("%s %d\n",tmp->phone,n+1);
j++;
}
if(j==exist[i]) break;
}
}
}
if(!j) {
printf("No duplicates.\n");
}
}

void formatPhone(char* phone) {
int i=0,j=0,len=strlen(phone),flag=1;
char c;
for(;i<len;i++) {
c=*(phone+i);
if(c>='0'&&c<='9') {
} else if(c=='-') {
continue;
} else if(c>='A'&&c<'Z') {
c=phone_map[c-65];
}
*(phone+j++)=c;
if(j==3&&i!=2) {
flag=0;
*(phone+j++)='-';
}
}
if(flag) {
for(i=7;i>3;i--) {
*(phone+i)=*(phone+i-1);
}
*(phone+3)='-';
}
*(phone+8)=0;
}

void insertPhone(struct poj_1002_phone* book,char* phone,int* exist) {
int i,flag=1,blInsert=1; // flag=0:前n位有比phone大者,flag=1:前n位有比phone小者
char c1,c2; // flag=0: 在数据集中间插入新数据,flag=1:在数据集末尾插入数据
phone_up=book;
phone_this=book;
while(phone_this->next!=NULL) {
phone_up=phone_this;
phone_this=phone_this->next;
i=1;
// 从次字符开始逐个比较,如果各字符相等,则i必为8,否则以flag标志比较结果
do {
c1=phone_this->phone[i];
c2=*(phone+i);
if(c1<c2) {
break;
} else if(c1==c2) {
i++;
} else {
flag=0;
break;
}
} while(i<8);
if(i==8) {
blInsert=0;
if(phone_this->count==0) {
(*exist)++;
}
(phone_this->count)++;
break;
} else {
if(!flag) { break; } // 找到了比目标字符串大的数据
}
}
if(blInsert) {
tmp=(struct poj_1002_phone*)malloc(sizeof(struct poj_1002_phone));
for(i=0;i<8;i++) {
tmp->phone[i]=*(phone+i);
}
tmp->phone[8]=0;
tmp->count=0;
if(flag) {
tmp->next=NULL;
phone_this->next=tmp;
} else {
tmp->next=phone_this;
phone_up->next=tmp;
}
}
}
展开
 我来答
johannbach
2011-04-20
知道答主
回答量:9
采纳率:0%
帮助的人:6.5万
展开全部
我的ac代码:
#include <cstdlib>
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
#include<cstdio>
#include<set>
#include<map>

using namespace std;

int main(int argc, char** argv)
{
long cas =0;
cin>>cas;
//vector<long> vl;
map<long,int> ml;set<long> lset;
cin.get();
// vl.reserve(cas);
for(int j=0;j<cas;++j)
{
char a[200];
gets(a);

long temp=0;
for(int i=0;*(a+i)!='\0';++i)
{

if(a[i]=='-'||a[i]=='Q'||a[i]=='Z'||a[i]=='q'||a[i]=='z')
continue;
else if(a[i]>='0'&&a[i]<='9')
temp+=(a[i]-'0');
else
switch(a[i])
{
case 'A':case 'B':case'C' :
case'c':case 'b':case'a' :temp+=2;break;
case 'd':case 'e':case 'f':
case 'D':case 'E':case'F' :temp+=3;break;
case 'g':case 'h':case 'i':
case 'G':case'H' :case'I' :temp+=4;break;
case 'j':case 'k':case 'l':
case'J' :case'K' :case'L' :temp+=5;break;
case'm' :case 'n':case 'o':
case 'M':case'N' :case'O' :temp+=6;break;
case 'p':case'r' :case 's':
case 'P':case'R' :case'S' :temp+=7;break;
case 't':case 'u':case 'v':
case'T' :case 'U':case 'V':temp+=8;break;
case 'w':case 'x':case 'y':
case 'W':case 'X':case 'Y':temp+=9;break;
default:break;
}
temp*=10;
}
temp/=10;
++ml[temp];

}
//set<long> lset;
if(ml.size()==cas)
cout<<"No duplicates."<<"\n";
else
{
for(map<long,int>::iterator i=ml.begin();i!=ml.end();++i)
{
if(i->second!=1)
printf("%.3ld-%.4ld %d\n",i->first/10000,i->first%10000,i->second);
}
}
return 0;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式