ACM.PKU第1002题,谁能帮我找找问题

在我电脑上答案是对的.可是提交了总是说答案错误!!!大家帮帮忙...小女子感激不尽!!!#include<stdio.h>#include<stdlib.h>#inclu... 在我电脑上答案是对的.可是提交了总是说答案错误!!!
大家帮帮忙...小女子感激不尽!!!

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

typedef struct {
char no[8];
int count;
}Node;

int Search(char ch)
{
if(ch=='A'||ch=='B'||ch=='C')
return '2';
if(ch=='D'||ch=='E'||ch=='F')
return '3';
if(ch=='G'||ch=='H'||ch=='I')
return '4';
if(ch=='J'||ch=='K'||ch=='L')
return '5';
if(ch=='M'||ch=='N'||ch=='O')
return '6';
if(ch=='P'||ch=='R'||ch=='S')
return '7';
if(ch=='T'||ch=='U'||ch=='V')
return '8';
if(ch=='W'||ch=='X'||ch=='Y')
return '9';
}

void Change(char str1[],char str2[])
{
int l,i,j=0;

l=strlen(str1);
for(i=0;i<l;i++)
{
if(str1[i]>='0'&&str1[i]<='9')//如果是数字
str2[j++]=str1[i];
if(str1[i]>='A'&&str1[i]<'Z'&&str1[i]!='Q')//字符是字母则转化成数字
str2[j++]=Search(str1[i]);
}
str2[j]='\0';

}

int main()
{
int n,i,j,num=0,k;
char str1[30],str2[8];
Node *p;

scanf("%d",&n);
p=(Node *)malloc(n*sizeof(Node));
if(p==NULL)
{
printf("not enough memory!\n");
exit(0);
}
fflush(stdin);
for(i=1;i<=n;i++)
{
gets(str1);
Change(str1,str2);//提取字符串中有用的七个字符并全部转换成数字
for(j=1;j<=num;j++)
if(strcmp(str2,p[j-1].no)==0)
{
p[j-1].count++;
break;
}
if(j>num)
{
strcpy(p[num].no,str2);
p[num].count=1;
num++;
}
}
for(i=0;i<num;i++)
if(p[i].count!=1)
break;
if(i>=num)
{
printf("No duplicates.\n");
exit(0);
}

while(1)
{
for(i=0;i<num;i++)
{
if(p[i].count!=1)
{
k=i;
break;
}
}
if(i>=num)
break;

for(i=k+1;i<num;i++)
{
if(p[i].count!=1)
if(strcmp(p[k].no,p[i].no)>0)
k=i;
}
printf("%c%c%c-%s %d\n",p[k].no[0],p[k].no[1],p[k].no[2],(p[k].no)+3,p[k].count);
p[k].count=1;
}
return 0;
}
展开
 我来答
百度网友ecc7578
2010-04-01 · TA获得超过806个赞
知道小有建树答主
回答量:715
采纳率:0%
帮助的人:694万
展开全部
//pku acm 1002 487-3279 by suqiang @ neuq & jlu 解题报告请访问:http://blog.csdn.net/china8848
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
using namespace std;

//定义元素最大个数
#define MAX_SIZE 100000

int sum=0;
int Root=0; //全局变量,根的索引
int now_size=0; //定义元素当前最大的索引

//分别定义关键字,父节点,左右孩子的数组为全局变量
//结点下标从1开始,p,right,left值为0时表示为null
int key[MAX_SIZE];
int times[MAX_SIZE];
int right_child[MAX_SIZE];
int left_child[MAX_SIZE];

//插入关键字为k的结点
void tree_insert(int k)
{

//x指示查找过程中下降的路径,y始终指向x的父结点
int y=0;
int x=Root;

//x下降
while(x!=0)
{ //如果值相等,对应times++
if(k==key[x])
{
times[x]++;
return;
}

y=x;
if(k>key[x])
x=right_child[x];
else
x=left_child[x];
}

//初始化结点
int index=++now_size;
left_child[index]=0;
right_child[index]=0;
key[index]=k;
times[index]=1;

//如果树为空
if(y==0)
Root=index;
else
{
//设置父结点的孩子结点
if(k<key[y])
left_child[y]=index;
else
right_child[y]=index;
}
}

//中序遍历
void inorder_walk(int x)
{
char str[7];
//如果该数为null,返回
if(x==0)
return;

//递归遍历左右子树

inorder_walk(left_child[x]);
if(times[x]!=1)
{
sum++;
//itoa(key[x],str,10);
//cout<<key[x]/10000<<"-"<<key[x]-key[x]/10000*10000<<" "<<times[x]<<endl;
//输出方法,注意一定要有0
printf("%03d-%04d %d\n",key[x]/10000,key[x]%10000,times[x]);
//cout<<str[0]<<str[1]<<str[2]<<"-"<<str[3]<<str[4]<<str[5]<<str[6]<<" "<<times[x]<<endl;
}
inorder_walk(right_child[x]);

}

int main()
{
int i,count,index,str_num;
//cin>>count;
//getchar();
scanf("%d\n",&count);
char number[7];
char ch;
for(i=0;i<count;i++)
{
index=0;
while(ch=getchar(),ch!='\n')
{
switch(ch)
{
case 'A':
case 'B':
case 'C':
ch='2';
break;
case 'D':
case 'E':
case 'F':
ch='3';
break;
case 'G':
case 'H':
case 'I':
ch='4';
break;
case 'J':
case 'K':
case 'L':
ch='5';
break;
case 'M':
case 'N':
case 'O':
ch='6';
break;
case 'P':
case 'R':
case 'S':
ch='7';
break;
case 'T':
case 'U':
case 'V':
ch='8';
break;
case 'W':
case 'X':
case 'Y':
ch='9';
break;

default:
break;
}
//如果是'-'就忽略
if(ch=='-')
continue;
number[index++]=ch;
}
//字符串->整数
str_num=atoi(number);
//cout<<str_num<<endl;
//插入
tree_insert(str_num);

}
//遍历
inorder_walk(1);
//如果没有大于一的
if(sum==0)
cout<<"No duplicates."<<endl;

return 1;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
deitytoday
2010-04-01 · TA获得超过348个赞
知道小有建树答主
回答量:242
采纳率:0%
帮助的人:310万
展开全部
楼上的是贴的别人的代码? 真的太繁琐.... 其实这题很简单

开个数组, 记录每个号码出现过的次数. 如, 487-3279对应数组中的第4873279个元素;

最后输入完毕之后 扫描一遍数组, 即可.

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
#define MAXN 10000003
int n, cn[MAXN], len;
char a[100];
const int mapp[30] = {2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, -1, 7, 7, 8, 8, 8, 9, 9, 9, -1};

int main()
{
int i, t, ans, sign = 0;
cin>>n;
while (n--)
{
scanf("%s", a), len = strlen(a), ans = 0;
for (i=0; i<len; i++)
{
if (a[i]>='0'&&a[i]<='9') t = a[i]-'0';
else if (a[i]>='A'&&a[i]<='Z') t = mapp[a[i]-'A'];
else t = -1;
if (t != -1) ans *= 10, ans += t;
}
cn[ans]++;
}
for (i=0; i<MAXN; i++)
if (cn[i] > 1) printf("%03d-%04d %d\n", i/10000, i%10000, cn[i]), sign = 1;
if (sign == 0) printf("No duplicates.\n");
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2010-04-12
展开全部
是错误答案?崩溃?还是别的?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式