一个让小弟百思不得其解的问题。希望各大侠指点指点

幻风 2008-04-18 08:30:55
问题

企业喜欢用容易被记住的电话号码。让电话号码容易被记住的一个办法是将它写成一个容易记住的单词或者短语。例如,你需要给滑铁卢大学打电话时,可以拨打TUT-GLOP。有时,只将电话号码中部分数字拼写成单词。当你晚上回到酒店,可以通过拨打310-GINO来向Gino's订一份pizza。让电话号码容易被记住的另一个办法是以一种好记的方式对号码的数字进行分组。通过拨打必胜客的“三个十”号码3-10-10-10,你可以从他们那里订pizza。

电话号码的标准格式是七位十进制数,并在第三、第四位数字之间有一个连接符。电话拨号盘提供了从字母到数字的映射,映射关系如下:
A, B, 和C 映射到 2
D, E, 和F 映射到 3
G, H, 和I 映射到 4
J, K, 和L 映射到 5
M, N, 和O 映射到 6
P, R, 和S 映射到 7
T, U, 和V 映射到 8
W, X, 和Y 映射到 9

Q和Z没有映射到任何数字,连字符不需要拨号,可以任意添加和删除。 TUT-GLOP的标准格式是888-4567,310-GINO的标准格式是310-4466,3-10-10-10的标准格式是310-1010。

如果两个号码有相同的标准格式,那么他们就是等同的(相同的拨号)

你的公司正在为本地的公司编写一个电话号码薄。作为质量控制的一部分,你想要检查是否有两个和多个公司拥有相同的电话号码。

Input

输入的格式是,第一行是一个正整数,指定电话号码薄中号码的数量(最多100000)。余下的每行是一个电话号码。每个电话号码由数字,大写字母(除了Q和Z)以及连接符组成。每个电话号码中只会刚好有7个数字或者字母。
Output

对于每个出现重复的号码产生一行输出,输出是号码的标准格式紧跟一个空格然后是它的重复次数。如果存在多个重复的号码,则按照号码的字典升序输出。如果输入数据中没有重复的号码,输出一行:
No duplicates.

Sample Input

12
4873279
ITS-EASY
888-4567
3-10-10-10
888-GLOP
TUT-GLOP
967-11-11
310-GINO
F101010
888-1200
-4-8-7-3-2-7-9-
487-3279

Sample Output

310-1010 2
487-3279 4
888-4567 3


我的程序:

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

int *init_(int n)//初始化
{
int *c;
if(!(c=(int *)malloc(n))) exit(0);
for(int i=0;i<n;i++)*(c+i)=0;
return c;
}
int search_(char c)//映射关系
{ //A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
int a[26]={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};
if(c>'a'&&c<'z') return a[c-'a'];
if(c>'A'&&c<'Z') return a[c-'A'];
}

void input_(int *a,int n)//保存输入,将一个号码保存为一个7位数
{
int i=0,m,t;
char c;
while(i<n)
{ t=0;
while(t<7)
{
scanf("%c",&c);
if(c=='\n'||c=='-') continue;//跳过回车和“-”
if((c>'a'&&c<'z')||(c>'A'&&c<'Z'))
m=search_(c); //字母转化为对应的数字
else m=c-'0';
if(m==-1) exit(0);//输入不合格
a[i]=a[i]*10+m;
t++;
}
i++;
}
}

void stict(int *a,int *b,int n)//号码个数统计,存于b数组中
{
int i,j;
for (i=0;i<n;i++)
{
b[i]++;
if(b[i]>0)
{
for(j=i+1;j<n;j++)
if(a[i]==a[j])
{
b[j]=-1;
b[i]+=1;
}
}
}
}

int main()
{
int *a,i=0,n;
scanf("%d",&n);
if(n<1||n>100000) exit(0);
a=init_(n);
input_(a,n);
int *b=init_(n);
stict(a,b,n);
for(i=0;i<n;i++)
if(b[i]>0)
printf("%d-%d %d\n",(*(a+i))/10000,(*(a+i))%10000,*(b+i));
getchar();getchar();
return 0;
}

我用devcpp调试,在n比较小的时候,输出是对的,但在输出完毕后不是正常终止,或者n比较大大时,根本就没输出……小弟我百思不得其解,恳请各位大侠指点啊!谢谢
...全文
175 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
幻风 2008-05-02
  • 打赏
  • 举报
回复
谢谢,你的算法给了我很大的启示……我会借鉴你的算法再改改我的程序^_^

发帖之后,我也改了一下我的程序:

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

int *init_(int n)
{
int *c;int i=0;
if(!(c=(int *)malloc(n*sizeof(int)))) exit(0);
for(;i<n;i++)*(c+i)=0;
return c;
}

void input_(int n)
{
int ch[26]={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 i,j,m,t;
int bn=0,//记录保存数据的个数
sm=0;//用来转化的
char c;
int *b=init_(n*2);//用来保存每行转换后的数据,按2维数组使用

//将每行数据转化成整数保存到b[]中
for(i = 0 ; i < n ; i++)
{
j=0;
sm=0;
while(j<7)
{
c=getchar();
if(c=='\n'||c=='-') continue;
else if(c>='A'&&c<='Z') m=ch[c-'A'];
else m=c-'0';
if(m==-1) exit(0);
sm=sm*10+m;
j++;
}
for(t=0;t<bn;t++) //查找是否已存在于b[]
if(b[2*t]==sm) {b[2*t+1]++;break;}
if(t==bn) //not find
{
b[2*bn]=sm;
b[2*bn+1]=1;
bn++;
}
}
//排序
for(j=0;j<bn;j++)
{
for(t=j,i=j+1;i<bn;i++)
if (b[2*t]>b[2*i]) t=i;
if(t!=j)
{
i=b[2*t];b[2*t]=b[2*j];b[2*j]=i; //交换值
i=b[2*t+1];b[2*t+1]=b[2*j+1];b[2*j+1]=i;//交换个数
}
}
//输出
int flag=0;int i1,i2,j1,j2;
for(t=0;t<bn;t++)
{
if(b[2*t+1]>1)
{
i=b[2*t]/10000;j=b[2*t]%10000;
if(i>0&&j>0)
{
for(i1=3,i2=100;i/i2==0;i1--,i2/=10);
for(j1=4,j2=1000;j/j2==0;j1--,j2/=10);
for(i2=0;i2<3-i1;putchar('0'),i2++);
printf("%d-",i);
for(j2=0;j2<4-j1;putchar('0'),j2++);
printf("%d %d\n",j,b[2*t+1]);
}
else if(i==0&&j>0)
{
for(j1=4,j2=1000;j/j2==0;j1--,j2/=10);
for(i2=0;i2<3;putchar('0'),i2++);
for(j2=0;j2<4-j1;putchar('0'),j2++);
printf("-%d %d\n",j,b[2*t+1]);
}
else if(i>0&&j==0)
{
for(i1=3,i2=100;i/i2==0;i1--,i2/=10);
for(i2=0;i2<3-i1;putchar('0'),i2++);
printf("%d-",i);
for(j2=0;j2<4;putchar('0'),j2++);
printf(" %d\n",b[2*t+1]);
}
else if(i==0&&j==0) printf("000-0000 %d\n",b[2*t+1]);
flag=1;
}
}
if(!flag)printf("No duplicates.");
}
int main()
{
int i=0,n;
scanf("%d",&n);
input_(n);
system("pause");
return 0;
}

我在ACM OJ上测试都是wrong answer,但我在自己测试了很多数据都没错……真是郁闷,请大哥大姐们批评批评,我都快没信心了
幻风 2008-05-02
  • 打赏
  • 举报
回复
谢谢,我刚学的c……不过我会赶快学习c++
幻风 2008-05-02
  • 打赏
  • 举报
回复
谢谢指点,晓得了
帅得不敢出门 2008-04-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 Tuzki 的回复:]
为什么不用map???应该很适合这个问题
map <int, int>
[/Quote]
forckgcs 2008-04-19
  • 打赏
  • 举报
回复

#include<iostream>
#include<iomanip.h>
#include<stdlib.h>
int cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
main()
{
int i,j,line,k,duplicate=0,times;
char ssphone[101],snphone[8];
char phonetable[]="2223334445556667777888999"; //用差值填充字符数组,快速计算转换后的值
cin>>line;
long *nphone=new long[line];
for(i=0;i<line;i++)
{
cin>>ssphone;
k=0;
for(j=0;ssphone[j];j++)
{
if(ssphone[j]>='A'&&ssphone[j]<'Z')
{
snphone[k]=phonetable[ssphone[j]-'A'];
k++;
}
if(ssphone[j]>='0'&&ssphone[j]<='9')
{
snphone[k]=ssphone[j];
k++;
}
}
nphone[i]=atoi(snphone); //字符数组转化为int
}
qsort(nphone,line,sizeof(long),cmp); //qsort快速排序
for(i=0;i<line;)
{
times=1;
for(j=i+1;j<line&&nphone[j]==nphone[i];j++)
times++; //号码已排序 相同号码相邻 计算出现次数
if(times>1)
{
duplicate=1;
cout<<setfill('0')<<setw(3)<<nphone[i]/10000<<"-"<<setfill('0')<<setw(4)<<nphone[i]%10000<<" "<<times<<endl;
}
//上面输出语句对输出格式做了精确控制
i=j; //将j赋给i 跳到下个号码
}
if(duplicate==0)cout<<"No duplicates."<<endl;
delete[]nphone;
system("pause");
}
Tuzki 2008-04-19
  • 打赏
  • 举报
回复
为什么不用map???应该很适合这个问题
map<int, int>
c_spark 2008-04-19
  • 打赏
  • 举报
回复
#include  <stdio.h> 
#include <stdlib.h>
#include <malloc.h>

int *init_(int n)//初始化
{
int *c;
if(!(c=(int *)malloc(n*sizeof(int)))) exit(0);
for(int i=0;i <n;i++)*(c+i)=0;
return c;
}
int search_(char c)//映射关系
{ //A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
int a[26]={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};
if(c>='a'&&c <='z') return a[c-'a']; //c >= 'a' && c <='z'
if(c>='A'&&c <='Z') return a[c-'A']; //...
}

void input_(int *a,int n)//保存输入,将一个号码保存为一个7位数
{
int i=0,m,t;
char c;
while(i <n)
{ t=0;
while(t <7)
{
scanf("%c",&c);
if(c=='\n' ||c=='-') continue;//跳过回车和“-”
if((c>='a'&&c <='z') ||(c>='A'&&c <='Z')) //c>='a' && c<='z'
m=search_(c); //字母转化为对应的数字
else m=c-'0';
if(m==-1) exit(0);//输入不合格
a[i]=a[i]*10+m;
t++;
}
i++;
}
}

void stict(int *a,int *b,int n)//号码个数统计,存于b数组中
{
int i,j;
for (i=0;i <n;i++)
{
b[i]++;
if(b[i]>0)
{
for(j=i+1;j <n;j++)
{
if(a[i]==a[j])
{
b[j]=-1;
b[i]+=1;
}
}
}
}
}

int main()
{
int *a,i=0,j,n;
scanf("%d",&n);
if(n <1 ||n>100000) exit(0);
a=init_(n);
input_(a,n);
int *b=init_(n);
stict(a,b,n);
for(i = 0; i < n; ++i) //如果有多个重复的按从小到大的顺序
{
for(j = i+1; j < n; ++j)
{
if(a[i] > a[j])
{
int tmp = a[i]; int _tmp = b[i];//交换的a[]大小,同时也要交换该值相应的b[]
a[i] = a[j]; b[i] = b[j];
a[j] = tmp; b[j] = _tmp;
}
}
}
for(i=0;i <n;i++)
if(b[i]>1) //输出时重复 > 1
printf("%d-%d %d\n",(*(a+i))/10000,(*(a+i))%10000,*(b+i));
return 0;
}
c_spark 2008-04-19
  • 打赏
  • 举报
回复
malloc使用时开辟n个大小的空间,没有指定n个空间是什么类型,大小不明...
if(!(c=(int *)malloc(n)))->if(!(c=(int *)malloc(n*sizeof(int))))
程序还有别的问题...
iu_81 2008-04-19
  • 打赏
  • 举报
回复
c=(int *)malloc(n*sizeof(int))
幻风 2008-04-19
  • 打赏
  • 举报
回复
不好意思,你改了哪里?
tgh621 2008-04-18
  • 打赏
  • 举报
回复

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

int *init_(int n)//初始化
{
int *c;
if(!(c=(int *)malloc(n*sizeof(int)))) exit(0);
for(int i=0;i <n;i++)*(c+i)=0;
return c;
}
int search_(char c)//映射关系
{ //A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
int a[26]={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};
if(c>'a'&&c <'z') return a[c-'a'];
if(c>'A'&&c <'Z') return a[c-'A'];
}

void input_(int *a,int n)//保存输入,将一个号码保存为一个7位数
{
int i=0,m,t;
char c;
while(i <n)
{ t=0;
while(t <7)
{
scanf("%c",&c);
if(c=='\n' ||c=='-') continue;//跳过回车和“-”
if((c>'a'&&c <'z') ||(c>'A'&&c <'Z'))
m=search_(c); //字母转化为对应的数字
else m=c-'0';
if(m==-1) exit(0);//输入不合格
a[i]=a[i]*10+m;
t++;
}
i++;
}
}

void stict(int *a,int *b,int n)//号码个数统计,存于b数组中
{
int i,j;
for (i=0;i <n;i++)
{
b[i]++;
if(b[i]>0)
{
for(j=i+1;j <n;j++)
if(a[i]==a[j])
{
b[j]=-1;
b[i]+=1;
}
}
}
}

int main()
{
int *a,i=0,n;
scanf("%d",&n);
if(n <1 ||n>100000) exit(0);
a=init_(n);
input_(a,n);
int *b=init_(n);
stict(a,b,n);
for(i=0;i <n;i++)
if(b[i]>0)
printf("%d-%d %d\n",(*(a+i))/10000,(*(a+i))%10000,*(b+i));
getchar();getchar();
return 0;
}


你想当“李逍遥”式的“大侠”吗? 这里无需计算机基础,无需编程经验,你也不必是计算机专业的在校大学生....只要爱好游戏,怀揣梦想! 有一定自主学习能力,跟着刘老师从“编程小白”修炼为游戏研发“大虾”吧!!!学习好Unity,其先决条件是一定要有稳固、扎实的编程基础!课程 《C# For Unity系列之入门篇》配套学习资料链接:http://pan.baidu.com/s/1gflxreN 密码:sou5;刘老师讲Unity学员群(2) 497429806一、热更新系列(技术含量:中高级):A:《lua热更新技术中级篇》https://edu.csdn.net/course/detail/27087B:《热更新框架设计之Xlua基础视频课程》https://edu.csdn.net/course/detail/27110C:《热更新框架设计之热更流程与热补丁技术》https://edu.csdn.net/course/detail/27118D:《热更新框架设计之客户端热更框架(上)》https://edu.csdn.net/course/detail/27132E:《热更新框架设计之客户端热更框架(中)》https://edu.csdn.net/course/detail/27135F:《热更新框架设计之客户端热更框架(下)》https://edu.csdn.net/course/detail/27136二:框架设计系列(技术含量:中级): A:《游戏UI界面框架设计系列视频课程》https://edu.csdn.net/course/detail/27142B:《Unity客户端框架设计PureMVC篇视频课程(上)》https://edu.csdn.net/course/detail/27172C:《Unity客户端框架设计PureMVC篇视频课程(下)》https://edu.csdn.net/course/detail/27173D:《AssetBundle框架设计_框架篇视频课程》https://edu.csdn.net/course/detail/27169三、Unity脚本从入门到精通(技术含量:初级)A:《C# For Unity系列之入门篇》https://edu.csdn.net/course/detail/4560B:《C# For Unity系列之基础篇》https://edu.csdn.net/course/detail/4595C: 《C# For Unity系列之中级篇》https://edu.csdn.net/course/detail/24422D:《C# For Unity系列之进阶篇》https://edu.csdn.net/course/detail/24465四、虚拟现实(VR)与增强现实(AR):(技术含量:初级)A:《虚拟现实之汽车仿真模拟系统 》https://edu.csdn.net/course/detail/26618五、Unity基础课程系列(技术含量:初级) A:《台球游戏与FlappyBirds—Unity快速入门系列视频课程(第1部)》 https://edu.csdn.net/course/detail/24643B:《太空射击与移动端发布技术-Unity快速入门系列视频课程(第2部)》https://edu.csdn.net/course/detail/24645 C:《Unity ECS(二) 小试牛刀》https://edu.csdn.net/course/detail/27096六、Unity ARPG课程(技术含量:初中级):A:《MMOARPG地下守护神_单机版实战视频课程(上部)》https://edu.csdn.net/course/detail/24965B:《MMOARPG地下守护神_单机版实战视频课程(中部)》https://edu.csdn.net/course/detail/24968C:《MMOARPG地下守护神_单机版实战视频课程(下部)》https://edu.csdn.net/course/detail/24979

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧