C++ Can';我不理解使用此地图背后的证据<&燃气轮机;方法
德拉齐尔正在和瓦尔达玩数学游戏 让我们将正整数x定义为其 数字。例如,f(135)=1!*3! * 5! = 720 首先,他们选择一个由n个数字组成的十进制数a 包含至少一个大于1的数字。这个数字可能是 从前导零开始。然后,他们应该找到最大正值 满足以下两个条件的x号:C++ Can';我不理解使用此地图背后的证据<&燃气轮机;方法,c++,C++,德拉齐尔正在和瓦尔达玩数学游戏 让我们将正整数x定义为其 数字。例如,f(135)=1!*3! * 5! = 720 首先,他们选择一个由n个数字组成的十进制数a 包含至少一个大于1的数字。这个数字可能是 从前导零开始。然后,他们应该找到最大正值 满足以下两个条件的x号: x既不包含数字0也不包含数字1 =f(x)=f(a) 帮助朋友找到这样的号码 输入第一行包含一个整数n(1 ≤ N ≤ 15) -号码 a中的数字 第二行包含a的n个数字。中至少有一个数字 一个大于1的值。数字a可能包含前导零
输入
4
1234
输出
33222 输入
3
555
输出
555 这是解决办法
#include <bits/stdc++.h>
#include <algorithm>
using namespace std;
int main()
{
map<char, string> mp;
mp['0'] = mp['1'] = "";
mp['2'] = "2";
mp['3'] = "3";
mp['4'] = "223";
mp['5'] = "5";
mp['6'] = "35";
mp['7'] = "7";
mp['8'] = "2227";
mp['9'] = "2337";
int n;
string str;
cin>>n>>str;
string res;
for(int i = 0; i < str.size(); ++i)
res += mp[str[i]];
sort(res.rbegin(), res.rend());
cout<<res;
return 0;
}
#包括
#包括这些转换背后的理论如下(以4为例):
较长的数字序列总是比较短的序列(至少对于正整数)产生较大的数字。因此,在可能的情况下,此代码生成更长的序列。通过上述示例,我们得到:
4! = 3! * 4
我们不能减少3!再进一步,因为3是素数。另一方面,4只是2²:
4 = 2² = 2! * 2!
因此,我们找到了数字序列中4的最佳替换为“322”。所有的数字都可以这样做,但素数是不可分解的,因此素数本身永远是最好的替代品
由于我们使用素因子分解,我们也知道我们只有(并且可能最长的)可以替换某个数字的数字串。我认为解释中缺少了一些位。“让我们将正整数x定义为其数字的阶乘的乘积。例如,.”不能真正理解这句话,看起来缺少示例。后来,“2.=f(x)=f(a)”,什么是f?在第一个等号之前似乎还缺少一些东西。抱歉,我编辑了它@jdehesa似乎引用了删除了文本的这一部分我似乎无法理解这一部分:4!=3! * 2! * 2.我们是从哪里得出这个结论的!是3!*2! * 2.举个例子6!是5!*3!<代码>4!=4 * 3 * 2 = 2 * 2 * 3 * 2 = 2! * 2! * 3!代码>(顺序不重要,因为我们将在之后进行排序)这是一个简单的数学事实。由于f(x)
的定义,我们可以在不改变f(x)
结果的情况下对每个数字执行此操作。这些都是预先计算好的。我有点理解@jdehesa 6!=6*5*4*3*2表示6!=3*2*5*4*3*2这意味着6!=3! * 5.我同意6!=3*2*5*4*3*2,那不是应该是6吗!=2! * 3! * 5.这将反过来转化为235,而不仅仅是35?或者我只是遗漏了一些东西。@jdehesa你可以很容易地用计算器来测试,但无论如何你必须考虑2!*3! * 5! = 另一方面,2*3*2*5*4*3*26*5*4*3*2=3*2*5*4*3*2
。2代码>将在计算中引入另一个2,导致不正确的结果。
4 = 2² = 2! * 2!