位数阶乘
题目九、位数阶乘
X是一个n位数的正整数
现在定义 , 比如F(135)=1!*3!*5!=720.
我们给定一个n位数的整数X(至少有一位数大于1,X中可能有前导0),
然后我们去找一个正整数(s)符合以下条件:
1.这个数尽可能大,
2.这个数中不能含有数字0或1。
3.F(s)=F(x)
Input
每个测试数据输入共2行。
第一行给出一个n,表示x为中数字的个数。(1<=n<=15)
第二行给出n位数的正整数X(X中至少有一位数大于1)
Output
共一行,表示符合上述条件的最大值。
输入示例
2
44
4
1234
5
12345
6
888888
12
001234567890
输出示例
332222
33222
533222
77777722222222222222
77755333332222222
解题思路:
这一题乍一看是数论的内容,我去感觉脑子要炸裂了。=。=
其实这道题也让我想了很久,但是想通之后发现还是一道找规律的问题。我把我思路的结果写出来大概就能理解这题的思路了。
9! = 9*8*7! = 7!*3!*3!*2!
8! = 8*7! = 7!*2!*2!*2!
6! = 6*5!=3!*5!
4!=2!*2!*3!
2,3,5,7不能分解原样输出,最后的结果在排序一次就好。
代码:
#include <cstdio> #include <algorithm> #define MAX 10000 using namespace std; char ans[MAX] = {'\0'}; // 结果数组 bool cmp(char a, char b) { return a > b;// 自定义排序,按照降序排序 } void change(long long a, int n) { int count = 0; // 记录ans数组的有效长度 for (int i = 0; a != 0; ){ switch (a % 10) {// 取最后一位 case 9: count = count + 4; // 下面i加了四次,有效长度count也加4 ans[i++] = (char)('0' + 7); ans[i++] = (char)('0' + 3); ans[i++] = (char)('0' + 3); ans[i++] = (char)('0' + 2); break; case 8: ans[i++] = (char)('0' + 7); ans[i++] = (char)('0' + 2); ans[i++] = (char)('0' + 2); ans[i++] = (char)('0' + 2); count += 4; break; case 6: ans[i++] = (char)('0' + 3); ans[i++] = (char)('0' + 5); count += 2; break; case 4: ans[i++] = (char)('0' + 2); ans[i++] = (char)('0' + 2); ans[i++] = (char)('0' + 3); count += 3; break; case 2: ans[i++] = (char)('0' + 2); count += 1; break; case 3: ans[i++] = (char)('0' + 3); count += 1; break; case 5: ans[i++] = (char)('0' + 5); count += 1; break; case 7: ans[i++] = (char)('0' + 7); count += 1; break; } a = a / 10;// 更正a的值,重新循环 } sort(ans, ans + count, cmp); // 排序 } int main() { int n; long long a; scanf("%d%lld", &n, &a); change(a, n); printf("%s\n", ans); return 0; }