题解 | 小红的好数
小红的好数
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")