Virtual Judge POJ 1002 487-3279

☆樱花仙子☆ 提交于 2019-12-02 13:15:18

模拟

#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
#include<map>
using namespace std;
int vis[100000000];
int n,flag;
long long a[100005];
char s[400];
int chang(char x) {
    if (x>='0'&&x<='9') {
        int tmp=x-'0'; 
        return tmp;
    }
    if (x>='A'&&x<='C') return 2;
    if (x>='D'&&x<='F') return 3;
    if (x>='G'&&x<='I') return 4;
    if (x>='J'&&x<='L') return 5;
    if (x>='M'&&x<='O') return 6;
    if (x>='P'&&x<='S') return 7;
    if (x>='T'&&x<='V') return 8;
    if (x>='W'&&x<='Y') return 9;   //返回对应的数值 
}
int main() {
    scanf("%d",&n);
    flag=0;
    for (int i=1; i<=n; i++) {
        scanf("%s",s);   //输入字符串 
        long long tmp=0;
        for (int j=0; s[j]; j++)  //如果s[j]存在 
            if (s[j]=='-') continue;    //跳过 
            else tmp=tmp*10+chang(s[j]);   //号码 
        vis[tmp]++;   //标记出现过几次 
        a[i]=tmp;     //记录号码 
        if (vis[tmp]>=2) flag=1;  //如果大于两次 就记录 准备输出 
    }
    if (!flag) {
        printf("No duplicates.\n");
        return 0;
    }
    sort(a+1,a+1+n); //出现的次数 默认升序   
    for (int i=1; i<=n; i++)
        if (vis[a[i]]>=2) {  //如果出现了两次 才输出 
            int kk=1000000;
            int ans=a[i];
            for (int j=1; j<=7; j++) {
                int tmp=ans/kk;   //取第一位 
                ans%=kk;   // 取第一位之后的数字 
                kk/=10;  //kk少一位0 
                printf("%d",tmp);  //输出每一位 
                if (j==3) printf("-");  //记得输出- 
            }
            printf(" %d\n",vis[a[i]]);  //输出次数  
            vis[a[i]]=0;  //再归零 
        }
    return 0;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!