487-3279(C++实训题)

写在前面:仅为个人代码/总结,未必标准,仅供参考!如有错误,还望指出交流,共同进步!

487-3279

【问题描述】
每个人都喜欢有令人难忘的电话号码。要想让电话号码变得令人难忘的一种方法是拼出一个令人难忘的单词或短语。例如,你可以拨打滑铁卢大学的电话,拨打令人难忘的电话号码TUT-GLOP。

有时只有一部分号码被用来拼写一个单词,例如,你可以拨打310-gino从Gino’s订购披萨。

要使电话号码令人难忘的另一种方法是以一种令人难忘的方式对数字进行分组。你可以从比萨饼小屋中订购比萨饼,方法是拨打他们的“3个10”,即号码3-10-10-10。

电话号码的标准格式是七位的十进制数字,第三和第四位之间包含连字符(例如888-1200)。电话的键盘提供字母到数字的映射,如下所示:

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。

当两个电话号码有相同的标准格式时是等价的(拨同样的号码)。

你的公司正在编制本地企业的电话号码目录,作为质量控制的一部分,你需要检查没有两个(或多个)企业具有相同的电话号码。

【输入形式】
输入包括一个案例。输入的第一行为一个正整数,指定目录中电话号码的数目(最多100,000)。其余的各行列出目录中的电话号码,每个号码单独占一行。每个电话号码都是一个由十进制数字、大写字母(不包括Q和z)和连字符组成的字符串。字符串中的七个字符或是数字或是字母。

【输出形式】
对于出现超过一次的每个号码,按照标准格式每个输出一行,然后是空格,接着输出出现的次数。只出现1次的电话号码不输出。

【样例输入】
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

【样例输出】
310-1010 2
487-3279 4
888-4567 3

【示例代码】

#include <bits/stdc++.h>
using namespace std;
struct phonenum
{
    
    
    string num;
    int sum;//记录个数
};
bool cmp(phonenum p,phonenum q)
{
    
    
    return p.num<q.num;
}
char yingshe(char ch)//求映射值
{
    
    
    char c='\0';
    if(ch=='A'||ch=='B'||ch=='C')
    {
    
    
        c='2';
    }
    else if(ch=='D'||ch=='E'||ch=='F')
    {
    
    
        c='3';
    }
    else if(ch=='G'||ch=='H'||ch=='I')
    {
    
    
        c='4';
    }
    else if(ch=='J'||ch=='K'||ch=='L')
    {
    
    
        c='5';
    }
    else if(ch=='M'||ch=='N'||ch=='O')
    {
    
    
        c='6';
    }
    else if(ch=='P'||ch=='R'||ch=='S')
    {
    
    
        c='7';
    }
    else if(ch=='T'||ch=='U'||ch=='V')
    {
    
    
        c='8';
    }
    else if(ch=='W'||ch=='X'||ch=='Y')
    {
    
    
        c='9';
    }
    return c;
}
int main()
{
    
    
    int n;
    cin>>n;
    int t=0;
    phonenum p[100];//可改用vector容器
    while(n--)
    {
    
    
        string s;
        cin>>s;
        char str1[20];
        strcpy(str1,s.c_str());//可直接通过下标对s进行访问,不必转化为字符串数组
        int len=strlen(str1);
        char str2[8];//用str2存储原字符串转化为标准电话号码状态下的字符串
        int j=0;
        for(int i=0;i<len;i++)
        {
    
    
            if(str1[i]>='0'&&str1[i]<='9')
            {
    
    
                str2[j]=str1[i];
            }
            else if(str1[i]>='A'&&str1[i]<'Z')
            {
    
    
                str2[j]=yingshe(str1[i]);
            }
            else {
    
    continue;}
            j++;
            if(j==3) {
    
    str2[j]='-';j++;}
        }
        str2[j]='\0';
        string str3(str2);
            if(t!=0)
            {
    
    
                bool b=false;
                for(int k=0;k<t;k++)
                {
    
    
                    if(str3==p[k].num)
                    {
    
    
                        p[k].sum++;
                        b=true;
                        break;
                    }
                }
                if(b==false)
                {
    
    
                    p[t].num=str3;
                    p[t].sum=1;
                    t++;
                }
            }
            else
            {
    
    
                p[t].num=str3;
                p[t].sum=1;
                t++;
            }
    }
    sort(p,p+t,cmp);//结构体排序
        for(int i=0;i<t;i++)
        {
    
    
            if(p[i].sum>1)//按要求输出
            {
    
    
                cout<<p[i].num<<' '<<p[i].sum<<endl;
            }
        }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45909595/article/details/107842222
今日推荐