PTA | 程序设计类实验辅助教学平台
两种方法其实都差不多
?这个方法用了一些stl
#include <bits/stdc++.h>
using namespace std;
int l, n, sum;
string s;
int main() {
cin >> l >> n;
sum = 1;
for (int i = 0; i < l; i++)
sum *= 26;
n = sum - n + 1; ///讲倒数的第几位,变成顺数的第位置
n--; ///向前移动一位
while (n) {
s += n % 26 + 'a';
n /= 26;
}
while (s.size() < l) ///位数不够时,补充到l位为止
s += 'a';
reverse(s.begin(), s.end());
cout << s << endl;
return 0;
}
?下方字符串处理更为稀泥
#include <iostream>
#include <cmath>
using namespace std;
int top;
char s[10];
int main() {
int l, n;
cin >> l >> n;
int m = pow(26, l) - n; //长度为l的总排列数为26^l,n为倒数第n个排列
while (l--) {
s[top++] = 'a' + m % 26; //这里如果m为0了,则不需退出,向前补a
m /= 26;
}
// for (int i = L - 1; i >= 0; i--) {
// a[i] = 'a' + sum % 26;
// sum /= 26;
// }如果这样的话就得正序输出了
for (int i = top - 1; i >= 0; i--) //由于是从后往前找的,则要逆序输出
cout << s[i];
cout << endl;
return 0;
}
|