poj 1002 487-3279(参考YSQ)

来源:互联网 发布:程序员能自学吗 编辑:程序博客网 时间:2024/05/01 06:14

题意:
输入n个字符串,每个字符串出去‘-’外只有7个字符,每个英文字母都有对应映射,请将输入字符串中标准电话号码出现次数大于1的输出
**Q与Z不会出现,so无map
于是构建映射^_^用map
首先解释公式 >o<:
x=x*10+(c-‘A’-(c>’Q’))/3+2
(c>’Q’)返回的是bool值1或0,于是如果输入字母为Q之后的字母向前移一位。
(c-‘A’-(c>’Q’))/3为什么要除以3呢(⊙o⊙)?
因为题目中三个字母对应一个映射
(c-‘A’-(c>’Q’))/3+2
为什么要+2呢 >o<
因为映射第一个数字是2

#include<cstdio>#include<map>using namespace std;map <int,int> s;int main(){    int n;    scanf("%d",&n);    char c;    //映射构建     for(int i=1;i<=n;i++){//n个字符串         int x=0;//x代表电话号码         for(int cnt=1;cnt<=7;){//每个字符串只有7个字符             scanf("%c",&c);            if(c>='A'&&c<='Z'){//如果输入的是字母,进行转换                 x=x*10+(c-'A'-(c>'Q'))/3+2;//(c>'Q)返回的是bool(1or0)                cnt++;              }             else if(c>='0'&&c<='9'){                x=x*10+c-'0';                 cnt++;            }        }         s[x]++;//电话号码对应映射+1     }    bool visi=false;    for(map<int,int>::iterator it=s.begin();it!=s.end();++it){//你写it++也无所谓啦        if(it->second>1){            printf("%03d-%04d %d\n",it->first/10000,it->first%10000,it->second);            //%03d代表输出三个整数,不够补0            visi=true;         }    }    if(visi==false)        printf("No duplicates.\n");    return 0;}
1 0