请格式化以下代码 #include <iostream> using namespace std; int n; long long up,sum; //获取超过第n个的独特的数:up;up时已有多少个独特的数:sum void getup() { long long cnt=1,x=1; //枚举i位数 for(long long i=1;i<=10;i++) { x*=10; if(i>1) cnt=cnt*(11-i); //每i位数有多少个独特的数 //枚举以j开头的i位数有多少个独特的数 for(int j=1;j<=9;j++) { sum+=cnt; if(sum>=n) { up=(j+1)*(x/10)-1; return; } } } } int main() { cin>>n; getup(); //逆序找到第n位独特的数 for(long long i=up;i>=1;i--) { bool box[15]={}; //每个数判断独特时都需要清空数组 //用于数位分离 long long sw=10,s=1; while(sw<=i) { sw*=10; s*=10; } //正向拆位,这样可以直接跳过"11*****"这种类型 bool flag=1; //假设独特 while(s>0) { int x=i%sw/s; if(box[x]>0) { flag=0; i=i-s+1; //跳过不满足要求的那些数 break; } box[x]++; sw/=10; s/=10; } if(flag && sum==n) { cout<<i<<endl; break; } if(flag) sum--; } return 0; }
时间: 2024-04-11 21:26:05 浏览: 196
以下是格式化后的代码:
```cpp
#include <iostream>
using namespace std;
int n;
long long up, sum;
// 获取超过第n个的独特的数:up;up时已有多少个独特的数:sum
void getup() {
long long cnt = 1, x = 1;
// 枚举i位数
for (long long i = 1; i <= 10; i++) {
x *= 10;
if (i > 1)
cnt = cnt * (11 - i); // 每i位数有多少个独特的数
// 枚举以j开头的i位数有多少个独特的数
for (int j = 1; j <= 9; j++) {
sum += cnt;
if (sum >= n) {
up = (j + 1) * (x / 10) - 1;
return;
}
}
}
}
int main() {
cin >> n;
getup();
// 逆序找到第n位独特的数
for (long long i = up; i >= 1; i--) {
bool box[15] = {}; // 每个数判断独特时都需要清空数组
// 用于数位分离
long long sw = 10, s = 1;
while (sw <= i) {
sw *= 10;
s *= 10;
}
// 正向拆位,这样可以直接跳过"11*****"这种类型
bool flag = 1; // 假设独特
while (s > 0) {
int x = i % sw / s;
if (box[x] > 0) {
flag = 0;
i = i - s + 1; // 跳过不满足要求的那些数
break;
}
box[x]++;
sw /= 10;
s /= 10;
}
if (flag && sum == n) {
cout << i << endl;
break;
}
if (flag)
sum--;
}
return 0;
}
```
阅读全文