对于给定的正整数N,编写一个完整的程序以查找最小自然数M,以使M的数字乘积等于N。N小于1,000,000,000。如果不存在M,则打印-1。在任何情况下,您的代码都不应超过10秒。
Sample Inputs
1
3
15
10
123456789
32
432
1296
Sample Outputs
1
3
35
25
-1
48
689
2899
对于给定的正整数N,编写一个完整的程序以查找最小自然数M,以使M的数字乘积等于N。N小于1,000,000,000。如果不存在M,则打印-1。在任何情况下,您的代码都不应超过10秒。
Sample Inputs
1
3
15
10
123456789
32
432
1296
Sample Outputs
1
3
35
25
-1
48
689
2899
Answers:
~9{{1$1$%!{\1$/1$}*}12*(}8*>{];-1}*]$1or
替换没有将小素数归为幂的版本,并同时节省8个字符。注意:12 =下限(9 log 10 / log 5)。
致谢:通过刻痕@mellamokb的技巧保存了两个字符;3从@Nabb提示保存。
12345
给我-1,所以123456789
如果我可以等待足够长的时间,也许也应该起作用。
n=prompt(m="");for(i=9;i-1;)n%i?i--:(m=i+m,n/=i);alert(n-1?-1:m?m:1)
编辑:从其他解决方案中借用了输入/输出思想,并且缩短了输出逻辑。
编辑2:通过删除for
循环中不需要的括号来保存2个字符。
编辑3:通过将while
循环重写为if
语句,节省了2个字符i++
。
编辑4:来回移动并减少对的操作,节省了2个字符i
。
编辑5:将if语句转换为三元格式,节省另外2个字符。
编辑6:通过移至i--
三元数的真实部分来保存2个字符,删除++i
。
prompt
。
m?m:1
=>m||1
for(s ='',i = 2,m = n = prompt(); i <m; i ++)而(!(n%i)){if(i> 9){alert(-1); E( )} n / = i; s + = i}提醒
编辑:使用其他JavaScript的想法,我可以将其简化为:
for(s='',i=9,n=prompt();i>1;i--)for(;!(n%i);n/=i)s=i+s;alert(n-1?-1:s?s:1)
最后!一个69个字符的解决方案,仅将1用于循环;)
for(s='',i=9,n=prompt();i>1;n%i?i--:[n/=i,s=i+s]);alert(n-1?-1:s?s:1)
好吧,刮掉一个逗号。
for(i=9,n=prompt(s='');i>1;n%i?i--:[n/=i,s=i+s]);alert(n-1?-1:s?s:1)
{for(i=9;i>1;$1%i?i--:($1/=i)<o=i o);print 1<$1?-1:o?o:1}
~[{9,{)}%{\.@%!},)\;.@@/.9>2$1>&}do])[.])@@{1>},+\9>[-1]@if$
~{9,{)}%{\.@%!},)\;.@@/.9>2$1>&}do])[.])@@{1>},+$\9>-1@if
编辑
好的,我认为此版本现在可以为每种情况提供正确的输出:-)
编辑2
根据@Peter的建议,减少了3个字符。
1
给予1
是一个重要的测试用例的原因是,这是一个令人讨厌的特殊情况-唯一的数字1
出现在输出中。恐怕这会破坏您的代码。
[
-如果您[
在评估时没有在堆栈上,那么]
它将占用堆栈上的所有内容。通过不包装-1
在数组中并移动最后一个字符,您可以在结尾处保存两个字符$
。
f n=head([m|m<-[1..10^9],product(map(read.return)$show m)==n]++[-1])
(show m)
为,即可删除一个字符$show m
。
m<-[1..9^9]
....否则它是一个无限列表...所以-1
永远不会发生....如果我错了请纠正我。
×⁵RDP$€io-
13字节解决方案:
×⁵RDP$€iµ’¹¬?
输入说明N
:
׳R create a range from 1 to N * 100 (replace ³ with ⁵ for a faster execution time)
DP$ define a function ($) to get the product of the digits of a number,
€ apply that function to each element in the list,
iµ get the index of the input N in the list (or 0 if it's not there), and yeild it as the input to the next link,
’¹¬? conditional: if the answer is 0, then subtract one to make it -1, otherwise, yeild the answer
18字节解决方案:
D×/
×⁵RÇ€i
Ç⁾-1¹¬?
D×/ product of digits function, takes input M
D split M into digits,
×/ reduce by multiplication (return product of digits)
×⁵RÇ€i range / index function
×⁵R make a range from 1 to N*10,
Ç€ run the above function on each of the range elements,
i get the index of N in the result, or 0 if it's not there
Ç⁾-1¹¬? main function:
Ç ¬? run the line above and check if the answer is null (0)
⁾-1 if it is, return "-1",
¹ otherwise, return the answer (identity function).
最后一个链接只是将-1替换为0(Jelly的默认falsey值,因为所有列表都是一个索引)。如果将0视为OK假值,则程序为8个字节。
$ƊƲµ
。(2)由于字符串-1
和数字-1
在输出时相同,因此使用数字可以节省2个字节。(3)P
是的简写×/
。(4)输入失败3125
。
_¬$
应该解决’¹¬?
o-
更短。
µ
我可以只使用_¬
未经$
其保存的2个字节!但是后来我意识到,o-
我可以完全省略µ
并节省3个字节!
n=gets.to_i;(d=1..9).map{|l|[*d].repeated_combination(l){|a|a.reduce(:*)==n&&(puts a*'';exit)}};p -1
1
付出1
是一个重要的测试案例。