Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:1002题,求助啊

Posted by hepeng at 2007-03-13 21:01:19 on Problem 1002
In Reply To:1002题,求助啊 Posted by:025028 at 2007-03-11 12:18:54
> 各位大哥 请问http://acm.pku.edu.cn/ 上的第1002题为什么把电话号码设为long 型通不过,
> 以下是从网上找的一个通过了的c++的程序
> 但当输入网页上的测试数据时输出却是:
> 002-0818 2
> 002-3615 4
> -02--8329 3
> 这很明显是一个错误的结果,却能通过
>  #include<stdio.h>
>  #include<stdlib.h>
>  int cmp(const void *elem1,const void *elem2)
>  {
>   return (*(int*)elem1-*(int*)elem2);
>  }
>  void main()
>  {
>   int a[26]={2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,9,9};
>   int pow[7]={1000000,100000,10000,1000,100,10,1};
>   int *tels,no=1,count;
>   int n,i,j,s;
>   char raw[41],temp;
>   scanf("%d",&n);
>   tels=new int [n];
>   for(i=0;i<n;i++)
>   {
>    tels[i]=0;
>    scanf("%s",raw);
>    s=0;
>    for(j=0;j<7;s++)
>    {
>     temp=raw[s];
>     if(temp>='0'&&temp<='9')
>     {
>      tels[i]+=pow[j]*(temp-'0');
>      j++;
>     }  
>     else
>      if(temp>='A'&&temp<='Z')
>      {
>       tels[i]+=pow[j]*a[temp-'A'];
>       j++;
>      }
>    }
>   }
>   qsort(tels,n,sizeof(int),cmp);
>   for(i=0;i<n;)
>   {
>    count=0;
>    for(j=i+1;j<n&&tels[j]==tels[i];j++)
>     count++;
>    if(count)
>    {
>     no=0;
>     printf("%03d-%04d %d\n",tels[i]/10000,tels[i]%10000,++count);
>    }
>   i=j;
>   }
>   if(no)
>    printf("No duplicates.\n");
>  }
> 
> 
> 
> 以下是我用C写的用二叉排序树实现的程序
> 其结果能与网页上的测试数据相稳合,
> 但不能通过
> 
> 
> 
> #include<stdio.h>
> #include<stdlib.h>
> int inc;
> struct Node
> {
>  long phone;
>  long repeat;
>  struct Node *left,*right;
>  }*Node;
> void createtree(struct Node *t,long temp)
> {
>    struct Node *s,*p;
>    s=t;
>    if(t->phone==0)
>    {
>      t->phone=temp;
>      t->repeat=1;
>      t->left=t->right=NULL;
>      return;
>      }
>    while(t)
>    {
>      if(temp==t->phone) {(t->repeat)++;inc=1;return;}
>      else if(temp>t->phone) {s=t;t=t->right;}
>      else {s=t;t=t->left;}
>      }
>    p=(struct Node *)malloc(sizeof(struct Node));
>    p->phone=temp;
>    p->repeat=1;
>    p->left=p->right=NULL;
>    if(temp>s->phone) s->right=p;
>    else s->left=p;
>   }
> void output(struct Node *head)
> {
>   if(!head)  return;
>   output(head->left);
>   if(head->repeat!=1)
>     printf("%ld-%ld %ld\n",head->phone/10000,head->phone%10000,head->repeat);
>   output(head->right);
>  }
> void freeNode(struct Node *head)
> {
>   struct Node *left,*right;
>   if(!head)  return;
>   left=head->left;
>   right=head->right;
>   free((void *)head);
>   freeNode(left);
>   freeNode(right);
>  }
> int main()
> {
>   int a[]={2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,0,7,7,8,8,8,9,9,9,0};
>   long i,j,k,n;
>   char ch;
>   long temp;
>   struct Node *head,*p,*q,*s;
>   head=(struct Node *)malloc(sizeof(struct Node));
>   head->left=head->right=NULL;
>   head->phone=0;
>   scanf("%ld",&n);
>   getchar();
>   inc=0;
>   for(i=0;i<n;i++)
>   {
>     temp=0;
>     while((ch=getchar())!='\n')
>      {
>  if(ch>='A'&&ch<='Z') temp=temp*10+a[ch-65];
>  else
>  if(ch>='0'&&ch<='9') temp=temp*10+ch-48;
>        }
>     createtree(head,temp);
>      }
>   if(inc==0) printf("No duplicates.\n");
>   else
>    output(head);
>   freeNode(head);
>   return 0;
> }
> 
> 
> 而必须把我的程序改为如下才能通过,真郁闷
> #include<stdio.h>
> #include<stdlib.h>
> int inc;
> struct Node
> {
>  long phone;
>  long repeat;
>  struct Node *left,*right;
>  }*Node;
> 
> void createtree(struct Node *t,long temp)
> {
>    struct Node *s,*p;
>    s=t;
>    if(t->phone==0)
>    {
>      t->phone=temp;
>      t->repeat=1;
>      t->left=t->right=NULL;
>      return;
> 
>      }
>    while(t)
>    {
>      if(temp==t->phone) {(t->repeat)++;inc=1;return;}
>      else if(temp>t->phone) {s=t;t=t->right;}
>      else {s=t;t=t->left;}
>      }
>    p=(struct Node *)malloc(sizeof(struct Node));
>    p->phone=temp;
>    p->repeat=1;
>    p->left=p->right=NULL;
>    if(temp>s->phone) s->right=p;
>    else s->left=p;
>   }
> void output(struct Node *head)
> {
>   if(!head)  return;
>   output(head->left);
>   if(head->repeat!=1)
>     printf("%03d-%04d %ld\n",(int)(head->phone)/10000,(int)(head->phone)%10000,head->repeat);
>   output(head->right);
> 
>  }
> void freeNode(struct Node *head)
> {
>   struct Node *left,*right;
>   if(!head)  return;
>   left=head->left;
>   right=head->right;
>   free((void *)head);
>   freeNode(left);
>   freeNode(right);
>  }
> int main()
> {
>   int a[]={2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,0,7,7,8,8,8,9,9,9,0};
>   long i,j,k,n;
>   char ch;
>   long temp;
>   struct Node *head,*p,*q,*s;
>   head=(struct Node *)malloc(sizeof(struct Node));
>   head->left=head->right=NULL;
>   head->phone=0;
>   scanf("%ld",&n);
>   getchar();
>   inc=0;
>   for(i=0;i<n;i++)
>   {
>     temp=0;
>     while((ch=getchar())!='\n')
>      {
> 	if(ch>='A'&&ch<='Z') temp=temp*10+a[ch-65];
> 	else
> 	if(ch>='0'&&ch<='9') temp=temp*10+ch-48;
>        }
>     createtree(head,temp);
>      }
> 
>   if(inc==0) printf("No duplicates.\n");
>   else
>    output(head);
>   freeNode(head);
>   return 0;
> }

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator