7-23 币值转换 (20 分)

 |
总阅读量


  这是一道比较麻烦的模拟题,思路和方式决定着代码量😏。原题链接,可以先去做一下😀。

  经历了一些小挫折以后还是AC了,题面就不搬了,开始分析:

  1. 可以用一个数组保存相应位的单位,这样就不用分心考虑单位了,而只考虑各个位数字之间的关系。
    为了相应的下标与其单位保持一致,整体后移一位。
    array<char, 10> base = {0, 'S', 'B', 'Q', 'W', 'S', 'B', 'Q', 'Y'};
    
  2. 接下来讨论数字之间的关系。
  • 可以将数字拆开放进一个数组,这样就完成了单位的映射。
    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;
}

反思:
在做比较麻烦的模拟题时,千万不要顺着思路去模拟,要时常跳出思维,要自己制定规则,
怎么方便怎么来。有时候顺着写,枚举特例,不仅大大增加了代码量,而且枚举时可能会漏掉某些条件,最终功败垂成。


雪林于

抛砖引玉 亦或 他山之石,可以攻玉。