题解 | 小红的好数

小红的好数

https://www.nowcoder.com/practice/de234d0d61d549c6a436e9509dbeea11

//  #牛客春招刷题训练营# https://www.nowcoder.com/discuss/726480854079250432
//  我的思路是禁止转换把这个好数看成一个(第一位是6进制,第二位是7进制。。。第五位是10进制)的数(为了方便,后面称之为特殊的数),那么每一位的权重分别是{1,6,42,336,3024};好数一共就有30240(第六位的权重,值取1) - 1个,把个数转化成这个特殊的数,那么每一位就表示当前这个数位在*可取的*数中的从小到大排名,当然是第五位先去(这也是为什么他是10进制,我是理解成组合数学中,他约束了后面的选择)
#include <iostream>
#include <string>
using namespace std;
const int mmax = 30240;//---------总个数
bool vis[10];//-----------访问过的数
int w[5] = {3024, 336, 42, 6, 1};//--------权重
int main() {
  int k;
  cin >> k;
  k = mmax - k;//---------计算出是第几小的数
  int cnt = 0;
  for (int i = 0; i < 5; i++){//-------------除权取余,转化成特殊的数
    cnt = cnt * 10 + (k / w[i]);
    k %= w[i];
  }
  string ans = "";
  int ww = 10000;
  for (int i = 0; i < 5; i++){
    int j = -1, index = 0;
    while(j < cnt / ww){
      if (!vis[index]){//--------没被访问过才能算入
        j++;
      }
      index++;
    }
    index--;
    vis[index] = 1;
    cnt %= ww;
    ww /= 10;
    ans += static_cast<char>('0' + index);
  }
  cout << ans;
  return 0;
}
// 64 位输出请用 printf("%lld")

全部评论

相关推荐

04-10 11:56
如皋中学 Java
高斯林的信徒:双c9能简历挂的?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务