车牌号问题

大家都知道,一辆汽车上路前先要去交警部门申领汽车号牌,号牌由两部分组成,以点字符“.”为分隔符,点字符“.”前部分是省区标识部分,点字符“.”后部分是五位车牌号,为了能够准确识别车牌,有些容易引起混淆的字符被限制使用,我们假设在某一个车牌系统中有如下限制:

1、 车牌是由数字和大写字母组成。

2、 考虑到字符“0”和字母“O”很容易引起混淆,因此系统中没有字母“O”。

3、 考虑到字符“0”和字母“Q”很容易引起混淆,因此系统中没有字母“Q”。

4、 考虑到字符“1”和字母“I”很容易引起混淆,因此系统中没有字母“I”。

5、 考虑到字符“8”和字母“B”很容易引起混淆,因此系统中没有字母“B”。

6、 规定前后顺序是:0、1、2、3、4、……、9、A、C、D、……、Y、Z。当然“Z”的后面又回到起始的“0”

你的任务是:在给定一个任意合法的五位车牌号和一个整数后,请你写个程序自动找出符合顺序要求的前面第若干个号码或者后面第若干个号码的合法的车牌号。

Input

本问题有多组测试数据,每一组只有一行,每一行有两部分组成,前面一部分是一个由五位字符组成的字符串,表示合法的五位车牌号;后面一部分是一个整数n(在32位整型表达范围内),其中正整数n表示请你找出后面第n个合法的车牌号,负整数n表示请你找出前面第n个紧挨着的合法的车牌号,车牌号和n之间用空格分隔。

Output

对于每一组输入,对应的输出也只有一行,即给定的车牌号的前第n个或后第n个合法的车牌号。

Sample Input

12345 -5
12345 8

Sample Output

12340
1234E

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=33554432;
char s[10];
map<int,int>mp;
int hs[100];
int main()
{
    int a;
    for(int i=0;i<=9;i++)
    {
        mp[i+'0']=i;
        hs[i]=i+'0';
    }
    int cnt=10;
    for(int i=0;i<26;i++)
    {
        if(i+'A'=='O')continue;
        if(i+'A'=='Q')continue;
        if(i+'A'=='I')continue;
        if(i+'A'=='B')continue;
        mp[i+'A']=cnt;
        hs[cnt]=i+'A';
        cnt++;
    }
    while(~scanf("%s%d",s,&a))
    {
        ll b=0;
        ll c=32ll*32*32*32;
        for(int i=0;i<5;i++)
        {
            b=b+c*mp[s[i]];
            c/=32;
        }
        b+=a;
        b=(b%mod+mod)%mod;
        string s="";
        while(b)
        {
            s+=hs[b%32];
            b/=32;
        }
        while(s.size()<5)
            s+='0';
        reverse(s.begin(),s.end());
        cout<<s<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值