这是一道比较麻烦的模拟题,思路和方式决定着代码量😏。原题链接,可以先去做一下😀。
经历了一些小挫折以后还是AC了,题面就不搬了,开始分析:
可以用一个数组保存相应位的单位,这样就不用分心考虑单位了,而只考虑各个位数字之间的关系。
为了相应的下标与其单位保持一致,整体后移一位。array<char, 10> base = {0, 'S', 'B', 'Q', 'W', 'S', 'B', 'Q', 'Y'};接下来讨论数字之间的关系。
可以将数字拆开放进一个数组,这样就完成了单位的映射。
int total=0; while(n) { s[total++] = n % 10; n /= 10; }最高位一定不是0,用pre记录前一位数字。
1). 如果当前位为0,且pre也为0,结束本次循环;特别的,当数字的万位也就是当前索引是4时,在前面的条件下,要输出一个W。
2). 如果当前位不为0,但pre为0,这就是中间的0了,只用输出一次0,然后再输出本位数字和单位,例如100010。
3). 如果末尾全是0,则不用进行输出,在之前非0的那一位已经输出了。
下面是C++代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
array<int, 9> s = {-1};
array<char, 10> num;
array<char, 10> base = {0, 'S', 'B', 'Q', 'W', 'S', 'B', 'Q', 'Y'};
int n, total = 0;
for(int i = 0; i < 10; i++) // 数字与小写字母的映射
num[i] = 'a'+ i;
cin >> n;
if(n == 0) // 单独处理0
cout << num[0];
else
{
while(n)
{
s[total++] = n % 10; // 将数字拆出来
n /= 10;
}
int pre = -1;
for(int i = total - 1; i >= 0 ; i--) // 从高到低位
{
if(s[i])
{
if(pre == 0)
cout << num[0]; // 中间的0,只输出一次
cout << num[s[i]] << base[i]; // 输出数字与单位
}
else
{
if(i == 4)
cout << base[4]; // 中间的0里面有万位,另外输出
if(pre == 0) // 中间0,跳过处理
continue;
}
pre = s[i];
}
}
cout << '\n';
return 0;
}
反思:
在做比较麻烦的模拟题时,千万不要顺着思路去模拟,要时常跳出思维,要自己制定规则,
怎么方便怎么来。有时候顺着写,枚举特例,不仅大大增加了代码量,而且枚举时可能会漏掉某些条件,最终功败垂成。