打了三天的持久战,终于被我…解决了。
ZOJ 1159 487-3279
电话号码,这两天同学们之间说得最多的恐怕就是这句“那道电话号码做出来了吗……”
其实这道题水得很。我很无奈的这么说,因为这样就显得我们水得不行了。没事,just finghting 。
题目意思很简单,给你一串字符,还有一个映射,输出出现多于2次的电话号码,格式。
在做映射转换的时候,没想到用数组转换下,还傻一样的用if语句排过去,真是不肯偷懒啊,不好不好,多想想!
还有个快速 排序 纯粹模板。也要记住、、。、
最近做字符串碰到两个公式,计算字符型数据和整型数据的转换
如本题就两个都涉及到了:
x=x*10+chr[i]-'0';
for(t=0;t<7;t++)
{
b[t]=integer[i]%10+'0';
integer[i]/=10;
}
第四 . 标记器的应用,都是很基本的功能。当时觉得很好用。
三天,一次TLE 一次WA 最后AC。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int integer[
100000];
//定义成全局变量。
int cmp(
const
void *a,
const
void *b)
{
return *(
int *)a-*(
int *)b;
}
int change(
char chr[
120])
//将输入的字符串转换为数字
{
int i;
int len;
int x=
0;
len=strlen(chr);
for(i=
0;i<len;i++){
if(chr[i]>=
'0' && chr[i]<=
'9'){
x=x*
10+chr[i]-
'0';
}
else
if(chr[i]-
'A'>=
0 && chr[i]-
'A'<=
14){
x=x*
10+(chr[i]-
'A'+
3)/
3+
1;
}
else
if(chr[i]==
'P' || chr[i]==
'R' || chr[i]==
'S'){
x=x*
10+
7;
}
else
if(chr[i]==
'T' || chr[i]==
'U' || chr[i]==
'V'){
x=x*
10+
8;
}
else
if(chr[i]==
'W' || chr[i]==
'X' || chr[i]==
'Y'){
x=x*
10+
9;
}
}
return x;
}
int
main()
{
int n,m,i,len,j,k=
0,t,ff;
char a[
120],b[
7];
//原始号码 字符串!
scanf(
"%d\n",&n);
//测试组数
while(n--)
{
scanf(
"%d",&m);
//原始号码个数
for(i=
0;i<m;i++)
//下面这段程序,是对原始号码进行处理
{
scanf(
"%s",a);
integer[i]=change(a);
}
//解决上述问题:排序。
qsort(integer,m,
sizeof(integer[
0]),cmp);
ff=
0;
for(i=
0;i<m;i++)
{
k=
1;
for(j=i+
1;j<m;j++)
{
if(integer[i]==integer[j]) k++;
else
break;
}
if(k>
1)
{
ff=
1;
for(t=
0;t<
7;t++)
{
b[t]=integer[i]%
10+
'0';
integer[i]/=
10;
}
printf(
"%c%c%c-%c%c%c%c %d\n",b[
6],b[
5],b[
4],b[
3],b[
2],b[
1],b[
0],k);
//0000111输出就有问题,还是用字符串吧
i=i+k-
1;
}
}
if(ff==
0) printf(
"No duplicates.\n");
if(n) printf(
"\n");
}
return
0;
}