分解它!…非常


15

好奇的孩子使用的程序可以将数字或表达式分解为以下形式:p1^e1 * p2^e2 * ... * pn^en。等于的指数1被省略,例如360 = 2^3 * 3^2 * 5

孩子将该输出作为新输入输入程序中,但是她不理解该^符号,因此有时她会跳过连接相应素数和指数的一个或多个符号。例如(360 =) 2^3 * 3^2 * 5 => 2^3 * 32 * 5 (= 1280)

由于这些错误,她可能会得到不同的因式分解,可以再次输入(跳过0或多个^)。她重复此过程,直到因式分解不再更改为止(也许不再存在^或正确复制了输出)。

您应该编写一个程序或函数,给定一个整数nn>1),以递增顺序输出所有可能的数字,其分解可能是孩子最终得到的分解(包括n)。例如,输入16可能的最终分解为(16 =) 2^4, (24 =) 2^3 * 3, (23*3 =) 3 * 23

输入详细信息:

  • 输入是一个大于的整数 1
  • 没有输入将产生大于 2^31-1
  • 没有输入将产生比1000输出数更多的输入

输出详细信息:

  • 以您的语言方便的形式显示的整数列表

例子:

输入=>输出

11    => 11
16    => 16 24 69
360   => 140 360 770 1035 1219 1280 2875 3680
605   => 560 605 840 2415
2048  => 211 2048
58564 => 230 456 1311 2508 9975 12768 13794 20748 58564 114114 322102

这是代码高尔夫球,因此最短的程序获胜。


我们已经没有分解因数了吗?
Optimizer

5
@Optimizer这是完全不同的。
randomra 2015年

1
360的最后一个数字应为3 6 80:2 ^ 3 * 3 ^ 2 * 5 => 23 * 32 * 5 = 3680
blutorange

@blutorange谢谢,编辑。
randomra 2015年

Answers:


5

果酱-66

ria{_{:XmF{1=1>},La\{a1$\f++}/La-{XI{~#}%:*/I{si}%:**}fI}%|}1e3*$p

http://cjam.aditsu.net/上尝试

说明:

ria                       read token, convert to integer and wrap in array
{…}1e3*                   repeat 1000 times
    _                     duplicate array
    {…}%                  transform each array item (number) using the block
        :X                store the number in X
        mF                factorize with exponents
        {1=1>},           keep only the factors with exponent > 1
        La\{a1$\f++}/     get all the subsets (*)
        La-               remove the empty subset
        {…}fI             for I = each subset of prime factors with exponent > 1
            XI{~#}%:*/    divide X by all the factors in I
            I{si}%:**     multiply with the primes from I
                          concatenated with their exponents
    |                     add the new numbers to the array, removing duplicates
$                         sort
p                         print the final array

(*)谢谢马丁


来自cjam神的cjam代码
kaine 2015年

任何数量^的都可以一步删除。因此对于58564 = 2^2 * 11^4它应该能够生成2508 = 22 * 114
randomra 2015年

@randomra,您应该为这种情况添加一个示例
aditsu退出,因为SE无效

@randomra现在应该更好了
aditsu退出了,因为SE

大!添加了示例。很抱歉跳过它。
randomra 2015年

4

红宝石,219

要开始使用:

s=->(x){A=[];def k(x)A<<x
y=Prime.prime_division x;n=0..y.size-1
n.each{|i|n.to_a.combination(i+1).each{|c|c.each{|z|v=y.dup
v[z][1]>1?v[z]=[v[z].join.to_i,1]:next
k v.inject(1){|s,b|s*b[0]**b[1]}}}}end;k x;A.uniq.sort}

创建一个返回数字数组的函数。

https://ideone.com/iOMGny

像这样使用它:

#usage

#load from the standard library
require"prime"

#read from stdin and print to stdout
p s.call $<.read.to_i

在手机上编写所有这些内容真是太有趣了...


3

Perl,193个字节

sub R{my($k,$v,@z)=@_;map{$k**$v*$_,$v>1?($k.$v)*$_:()}@z?R(@z):1}
@q=(0+<>);
while($x=pop@q){
my%f;@r=sort{$a<=>$b}@r,$x;
for(2..$x){$x/=$_,$f{$_}++while$x%$_<1}
$_~~@r||push@q,$_ for R%f
}
print"@r"

仅添加换行符以提高可读性。

for循环将下一个数字($x)分解%f为质数和幂的哈希()。递归函数(R)使用此哈希值来生成所有可以通过去除^符号获得的数字。这些数字被添加到队列(@q)中,外部while循环重复该过程。队列中的每个数字也保存在唯一的,已排序的数组(@r)中以进行打印。


3

Pyth,46 45 44

Su{smmu*/N^T/PdTv+`T`/PdTkdyft/PdT{PdGU^T3]Q

在这里尝试。

修复了多个^错误。例如:

Input:  58564
Output: [230, 456, 1311, 2508, 9975, 12768, 13794, 20748, 58564, 114114, 322102]

请注意,此代码依赖于在提出问题后推送的一些官方编译器的错误修正。但是,它不使用任何新的语言功能。


58564会得到什么?
aidtsu退出是因为SE为EVIL,2015年

[230,456,1311,58564,322102],这是错误的。
isaacg 2015年

@aditsu解决了该问题。
isaacg 2015年

由于Pyth的记录不严格(根据我的发现),因此很难区分错误修复和新功能,因此我决定不选择该条目作为最终答案。
randomra 2015年

@randomra我了解您不接受此答案的决定。但是,我只想提一下错误修正是什么:u在另一个reduce中使用reduce()是不可能的。我在适当的位置将2更改为3,这样reduce将会使用3个输入而不是2个。
isaacg 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.