答案 0 :(得分:22)
C#,69
x是输入数字
int i=2;while(x>1)if(x%i++==0){x/=--i;Console.Write(i+(x>1?"x":""));};
包括:
using system;
namespace nameSP
{
class Program
{
static void Main(string[] args)
{
int i=2;while(x>1)if(x%i++==0){x/=--i;Console.Write(i+(x>1?"x":""));};
}
}
}
答案 1 :(得分:20)
强制性J回答(2个字符):
q:
答案 2 :(得分:15)
ANSI C,79个字符
main(d,i){for(d+=scanf("%d",&i);i>1;i%d?++d:printf("%d%c",d,(i/=d)>1?'x':10));}
答案 3 :(得分:11)
Mathematica(包含括号的15个字符):
FactorInteger
示例:
FactorInteger[42]
{{2, 1}, {3, 1}, {7, 1}}
答案 4 :(得分:10)
Haskell,53个字符:(包括3个换行符)
a%1=[]
a%n|mod n a<1=a:p(div n a)|1>0=(a+1)%n
p=(2%)
示例:
*Main> p 1806046
[2,11,11,17,439]
答案 5 :(得分:10)
Python:带输入和输出的77个字符
d,s,n=2,'',input()
while n>1:
if n%d:d+=1
else:s+='%dx'%d;n/=d
print s[:-1]
答案 6 :(得分:6)
Python(没有I / O的228个字符,340个字符):
import sys
def primeFactors(n):
l = []
while n > 1:
for i in xrange(2,n+1):
if n % i == 0:
l.append(i)
n = n // i
break
return l if len(l) > 0 else [n]
n = int(sys.argv[1])
print '%d: %s' % (n, 'x'.join(map(lambda x: str(x), primeFactors(n))))
可压缩为120个字符:
import sys
n,l=int(sys.argv[1]),[]
while n>1:
for i in range(2,n+1):
if n%i==0:l+=[str(i)];n/=i;break
print'x'.join(l)
注意:这是if
之前的制表符,而不是四个空格。它可以作为另一个缩进级别,只需要一个字符而不是两个字符。
答案 7 :(得分:5)
81个字符
let rec f n=if n=1 then[]else let a=[2..n]|>List.find(fun x->n%x=0)in a::f(n/a)
这是非常低效的,但由于目标无疑是尽可能写出最短的代码,我忽略了这个问题。
可读表格(使用#light
语法):
let rec factorise n =
if n = 1 then [] else
let a = [2 .. n] |> List.find (fun x -> n % x = 0)
a :: factorise (n / a)
答案 8 :(得分:5)
APL中的11个字符
排除功能标题和换行符
factors←{2÷/∪⌽∧\⍵∨⍳⍵}
答案 9 :(得分:5)
GNU bc ,47个字符,包括收集输入(需要print
的GNU扩展,else
和read
):
x=read();for(i=2;x>1;)if(x%i){i+=1}else{x/=i;i}
如果你真的想要输出中的x个字符,它就是64个字符:
x=read();for(i=2;x>1;)if(x%i){i+=1}else{x/=i;print i;if(x>1)"x"}
另外,请注意,使用bc可以处理任意长度的数字。
答案 10 :(得分:4)
实际产生指定输出的Mathematica答案:
Print@@Riffle[Join@@ConstantArray@@@FactorInteger[n],x]
55个字符。假设n
是输入数字,而x
没有分配给它的值。
答案 11 :(得分:4)
Erlang,核心是122个字符,整个模块为152个字符:
-module(pf).
-export([f/1]).
f(N) -> f(N,2,[]).
f(1,_,L) -> lists:reverse(L);
f(N,P,L) when N rem P == 0 -> f(N div P,P,[P|L]);
f(N,P,L) -> f(N,P+1,L).
从控制台呼叫:
70> string:join([integer_to_list(X) || X <- pf:f(1806046)], "x").
"2x11x11x17x439"
答案 12 :(得分:4)
Ruby 39B 71B(通过STDIN)
#!ruby -nrmathn
p$_.to_i.prime_division.map{|d,c|[d]*c}.flatten.join"x"
答案 13 :(得分:3)
最好的Perl答案 - 70个字符,没有额外的模块(除非你算上5.10的特殊功能):
perl -nE'sub f{($a)=@_;$a%$_||return$_,f($a/$_)for 2..$a}$,=x;say f$_'
不适用于1或0,但适用于其他所有内容。如果您不喜欢使用say
,或者使用的是早期版本的Perl,那么这是一个81个字符的版本:
perl -ne'sub f{($a)=@_;$a%$_||return$_,f($a/$_)for 2..$a;}$,=x;$/="\n";print f$_'
答案 14 :(得分:2)
VB6 / VBA - 147个字符
我不允许发表评论,但可以通过不Option Explicit
来缩短之前的答案。利用VB6 / VBA的一些更危险的功能,您可以使用下面的一个。无需声明变量是什么,并且如果最终的短缺,也不需要将函数声明为public!如果它在同一行上,则不需要End If。
Function P(N As Long)
Dim I, O
Do While N > 1: For I = 2 To N
If N Mod I = 0 Then O = O & " " & I: N = N / I: Exit For:
Next: Loop: P = O
End Function
这可以通过以下方式进行测试:
Public Sub TestP()
Dim s: s = P(1806046)
Debug.Print s
End Sub
答案 15 :(得分:2)
Go编程语言,100个字符:
package main;func main(){n:=42;c:="x";for i:=2;n>1;i++{if n%i<1{n/=i;if(n<2){c=""};print(i,c);i--}}}
我的程序,正确的缩进:
package main
func main() {
n := 42 // or whichever input number you like
c := "x" // separating printed integers
for i:=2 ; n>1; i++ {
if n%i<1 { // n%i==0
n /= i
if(n<2) { c = "" } // n==1
print(i, c)
i--
}
}
}
答案 16 :(得分:2)
幸福感:106个字符
procedure f(atom a)atom x=2
loop do
while remainder(a,x)do
x+=1
end while
?x
a/=x
until a=1
end procedure
答案 17 :(得分:2)
74 Python中的75个字符
a=input();b=2
while b*b<=a:
if a%b==0:print b;a/=b;b=1
b+=1
print a
源自我的TI-BASIC主要因子分解代码。
因为我在谈论TI-Basic ......
TI-Basic中的77个字符
input a
2→b
while b²<a
a/b→c
if int(c)=c:then:disp b:c→a:1→b:end
b+1→b
end
disp a
答案 18 :(得分:2)
Perl,70 char
$y=<>;for($i=2;$i<=$y;){next if$y%$i++;$y/=--$i;push@x,$i}print@{$,=x}
答案 19 :(得分:2)
VB6 / VBA - 190个字符
Public Function P(N As Long) As String
Dim I As Long, O As String
Do While N > 1: For I = 2 To N
If N Mod I = 0 Then
O = O & " " & I: N = N / I: Exit For: End If: Next: Loop: P = O: End Function
答案 20 :(得分:2)
虽然这不是我最好的作品,但这是我在Haskell中的回答,83个字符。
f n = s [2..n] n
s [] _ = []
s (p:z) n = p:s [x | x<-z, mod x p /= 0, mod n x == 0] n
我相信还有更多可以做的事情,但现在它还不错。
编辑:重新排列事物以削减角色,效率更低,但更小。
答案 21 :(得分:2)
use Math::Big::Factors;
@f=factor_wheel($ARGV[0],1);
print @f;
(不要那样看我。承诺的程序员是 lazy 程序员。)
答案 22 :(得分:2)
Perl,223个字符
perl -ne'f($o=$_,2);sub f{($v,$f)=@_;$d=$v/$f;if(!($d-int($d))){print"$f ";if(!p($d)){print"$d ";return(0);}else{f($d,$f);}}else{while(p(++$f)){}f($v,$f);}}sub p{for($i=2;$i<=sqrt($_[0]);$i++){if($_[0]%$i==0){return(1);}}}'
答案 23 :(得分:1)
答案 24 :(得分:1)
Python递归解决方案
99个字符(包括空格) 87个字符(不含空格)
def f(n,i=2,r=""):
while n%i<1:r+="%dx"%i;n/=i
return f(n,i+1,r)if n>1 else r
print f(input())[:-1]
更新: 一个完全递归的版本
def f(n,i=2,x=""): return x if n<2 else f(n,i+1,x)if n%i else f(n/i,i,x+'%dx'%i)
print f(input())[:-1]
除了最小的输入外,两个版本都容易出现堆栈溢出。
答案 25 :(得分:1)
C#和LINQ,241个字符:
public IEnumerable<int> F(int n)
{
return Enumerable.Range(2,n-1)
.Where(x => (n%x)==0 && F(x).Count()==1)
.Take(1)
.SelectMany(x => new[]{x}.Concat(F(n/x)))
.DefaultIfEmpty(n);
}
public string Factor(int n) {
return F(n).Aggregate("", (s,i) => s+"x"+i).TrimStart('x');
}
压缩:
int[] F(int n){return Enumerable.Range(2,n-1).Where(x=>(n%x)==0&&F(x).Length==1).Take(1).SelectMany(x=>new[]{x}.Concat(F(n/x))).DefaultIfEmpty(n).ToArray();}void G(int n){Console.WriteLine(F(n).Aggregate("",(s,i)=>s+"x"+i).TrimStart('x'));}
答案 26 :(得分:1)
C#,366个字符
对于类似的东西,C#并不是最常用的语言,但这非常紧凑:
class P {
static void Main(string[] a) {
int i = int.Parse(a[0]);
var p = new System.Collections.Generic.List<int>();
for (int n = 2; i > 1; n++)
if (p.Find(q => n % q == 0) == 0) {
p.Add(n);
while (i % n == 0) {
System.Console.WriteLine(n);
i /= n;
}
}
}
}
编辑:
我看到Noldorin在他的F#代码中使用了List.Find方法,并意识到它会比foreach更短......
编辑:
好吧,如果它不一定是一个完整的程序...
C#,181个字符
string f(int i) {
var r = "";
var p = new System.Collections.Generic.List<int>();
for (int n = 2; i > 1; n++)
if (p.Find(q => n % q == 0) == 0) {
p.Add(n);
while (i % n == 0) {
r += "x" + n;
i /= n;
}
}
return r.Substring(1);
}
压缩:
string f(int i){var r="";var p=new System.Collections.Generic.List<int>();for(int n=2;i>1;n++)if(p.Find(q=>n%q==0)==0){p.Add(n);while(i%n==0){r+="x"+n;i/=n;}}return r.Substring(1);}
答案 27 :(得分:0)
在PARLANSE中,这可以解决问题(252个字符):
(action (procedure natural)
(loop
(ifthen (== ? 1) (return))
(do f i 2 ? 1
(ifthen (== (modulo ? i) 0)
(print ?)
(= ? (/ ? i))
(exit f)
)ifthen
)do
)loop
)action
我确信APL程序要小得多。
答案 28 :(得分:0)
f="";
for(i=2;i<n;i++)
if(n%i==0){
f+=i+"x";
n/=i;i--
}
f+=n;
(54个字符)
首先声明n= the number to be factored
(包括2个字符)
然后执行代码。
示例:
> n=12345
12345
> f="";for(i=2;i<n;i++)if(n%i==0){f+=i+"x";n/=i;i--}f+=n
"3x5x823"
答案 29 :(得分:0)
不打印结果。
l,f,p=len,lambda n:list(filter(lambda b:n%b==0,range(2,n))),lambda n:l(f(n))==0;r=lambda n: n if p(n) else[x if p(x) else r(x) for x in [f(n)[0],f(n)[l(f(n))-1]]]
将其用作功能:
print(r(1806046))