Algorithm 从一位数和简单操作创建任意数

Algorithm 从一位数和简单操作创建任意数,algorithm,Algorithm,如何使用最少的基本算术运算(add、sub、mult、div)尽可能优化地计算一个任意整数 表0-9中的数字成本为0。 其他数字必须使用初等运算从中建立起来 ("2+4*3" = 14 not 18) 示例: 25是从5*5建立起来的 123可以通过许多不同的方式建立,但最理想的是5*5*5-2 起初我想用动态规划来解决这个问题,但我无法克服引入乘法的障碍,而且我认为它对大数不实用。 但是如果是,请告诉我怎么做 如果有人能告诉我类似的正确问题,我将不胜感激。不幸的是,你所寻找的答案并不像其他问

如何使用最少的基本算术运算(add、sub、mult、div)尽可能优化地计算一个任意整数

表0-9中的数字成本为0。 其他数字必须使用初等运算从中建立起来

("2+4*3" = 14 not 18)
示例: 25是从5*5建立起来的

123可以通过许多不同的方式建立,但最理想的是5*5*5-2

起初我想用动态规划来解决这个问题,但我无法克服引入乘法的障碍,而且我认为它对大数不实用。 但是如果是,请告诉我怎么做


如果有人能告诉我类似的正确问题,我将不胜感激。

不幸的是,你所寻找的答案并不像其他问题那样简单明了。结果是你多次被否决。我可能不会这么快就扣动扳机,但这是一个有效的问题


我建议你用两个算术运算来确定只需一个算术运算(所有介于-9和18之间的整数和乘法表中出现的数字)就能得到的一组数字。。。使用三个算术运算等,使得给定数量算术运算的解集中的成员资格可以确定给定目标整数x的语句大小的下确界:

{xϵI}cAN

整数的单个“x”元素是aN)的子集,其中aN)被定义为执行N可能的算术运算后的可能解集。(上限(N)定义为“1+1+1…+1+1”中的算术运算数(正数)和“0-1-1…-1-1”中的负数)

然后,最优解决方案集将通过以下方式定义:

A(下确界(N),其中下确界(N)最小化算术运算的数量

("2+4*3" = 14 not 18)
编辑: 今天晚上我用铅笔做了进一步的粗略研究,之前我建议将非素数作为A(1)的成员,这对于素数因子>=11的任何非素数都是例外。如下文所述,其中至少有22个

如果我们从开始,A(0)定义为整数的闭集[0,9] 然后A(n+1)=uA(n),A(0)),u是一组算术函数

由于存在非有理结果的最小公倍数,除法不能成为最优解的一部分,因此u'(x,y)={x+y,x-y,x*y};包含x和y的最小限制集为整数

同样的消去法不适用于减法,因为我们需要乘积上下的邻域

我们也可以从所有最优解中消除零,留下A'(0)=[1,9]。 因为我们注意到单态{0}ϵA(0),并且因为根据零的定义,

0*A(n)=0和
0+A(n)=A(n)

零的最佳解决方案始终为“0”,并且由于产品空间中出现的任何“+0+”或零抵消了整个产品或零添加步骤,因此该解决方案不是最佳的,因此可以从搜索中排除

因此,在伪代码中找到A(n),nϵn(自然)的整个解集的一种方法是忽略运算顺序:

**A**(n) = **A**(n-1); // n*1 is still included, 
                       //  and n+0 is by proxy included for posterity 

for x ϵ **A**(n-1)
    for y ϵ **A'**(0)
        for u ϵ **u'**
            A(n) = Union( A(n), u(x,y) );
        next u
    next y
next x 
请注意,我无法确定输出是否已排序,我们忽略了操作顺序,因此对于您正在寻求的解决方案,这还不是一个有效、完整的算法,而且我正在打瞌睡,因此我将再次编辑此内容并描述操作顺序

("2+4*3" = 14 not 18)
编辑:操作顺序说明

首先,感谢您接受此解决方案,正如我昨晚所说,我将描述操作顺序

("2+4*3" = 14 not 18)
因为我们是专门处理乘法的,那么我们应该首先在语句中找到乘积,这样我们就有了一个集合p,它将代表一个可接受语句中的一组加数和求值乘积;我们不会用字符串表示P

所以首先我们需要遍历字符串并寻找乘法运算,这样我们就可以创建一个整数数组p,其总和就是语句的解。在伪代码中,这可能如下所示:

array **P** = empty    // the upper limit for the bounds of **P**
                       //  is number of operators - number of multiplications + 1

first **P** = first **d**   // we can initialize the first value of **P**

for j ϵ N, j <= n      // j is a natural number and 'n' is the number of operators

    given u(j) ϵ **u** // **u** is the set of operations
    given d(j) ϵ **d** // **d** is the set of digits of length n + 1        

    if u(j) is not multiplication
    {
        **P** = Union( **P**, d(j+1) );   // append d(j+1) to the end of **P**
        if u(j) is subtraction negate last **P**  // then last **P** is negative
    }
    else //---> u(j) is multiplication
    {
        last **P** *= d(j+1)
    }

next j

solution = sum **P**; solution ϵ I. 
因此,我们必须执行一个例程,该例程必须在一组可能的语句中搜索“n”个操作。然后,我们可以通过消除加法和乘法来缩小语句集的范围,进一步通过消除乘法来缩小语句集的范围,看起来您也这样做了。我假设您提供的密码不仅在追加数字“1”之前检查上一个操作是否为uϵ{+,-},而且在追加操作uϵ{*}之前检查上一个数字是否为“1”

一旦我们能够在特定长度的优化语句集中搜索目标整数,我们就可以迭代语句的length属性,直到目标整数是一个已计算的解决方案,然后,我们可以开始将最小长度的语句保存到一个字符串数组中,并在迭代给定大小的其余语句后停止

这将是一次彻底的搜索。即使我们要检查目标整数在数字乘积空间中的可分性,当我们无法将其清晰地分解为单个数字的乘积空间时会发生什么?你能提出一个建议吗