28

任意の数の素因数を文字数で求める最短の方法は何ですか?

入力例: 1806046

出力例: 2x11x11x17x439

電卓の例

4

30 に答える 30

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":""));};
     }
   }
}
于 2009-08-20T19:15:26.403 に答える
20

必須の J 回答 (2 文字):

q:
于 2009-08-20T16:53:13.430 に答える
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));}
于 2009-08-20T13:39:39.893 に答える
11

Mathematica (括弧を含めて 15 文字):

FactorInteger

例:

FactorInteger[42]

{{2, 1}, {3, 1}, {7, 1}}
于 2009-08-20T11:41:27.257 に答える
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]
于 2009-08-21T00:54:25.850 に答える
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]
于 2009-08-20T21:35:33.157 に答える
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、4 つのスペースではありません。これは別のレベルのインデントとして機能し、2 文字ではなく 1 文字しかかかりません。

于 2009-08-20T08:45:25.287 に答える
5

F#

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)
于 2009-08-20T09:17:44.690 に答える
5

APLの11文字

関数ヘッダーと改行を除く

factors←{2÷/∪⌽∧\⍵∨⍳⍵}
于 2012-05-03T14:18:20.737 に答える
5

GNU bcprint 、入力の収集を含む 47 文字 ( 、elseおよびには GNU 拡張が必要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 を使用すると、任意の長さの数値を処理できることに注意してください。

于 2009-08-30T13:58:26.250 に答える
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"
于 2009-08-21T04:58:09.583 に答える
4

Ruby 39B 71B (via STDIN)

#!ruby -nrmathn
p$_.to_i.prime_division.map{|d,c|[d]*c}.flatten.join"x"
于 2009-08-23T17:04:10.690 に答える
2

VB6/VBA-147文字

コメントを残すことはできませんが、を持たないことで前の回答をいくらか短くすることができOption Explicitます。VB6 / VBAのより危険な機能のいくつかを利用して、以下の機能を使用できます。変数が何であるかを宣言する必要はありません。また、究極の短さを求める場合でも、関数をパブリックとして宣言する必要はありません。また、同じ行にある場合はEndIfは必要ありません。

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
于 2010-02-10T10:16:53.617 に答える
2

パール、70文字

$y=<>;for($i=2;$i<=$y;){next if$y%$i++;$y/=--$i;push@x,$i}print@{$,=x}
于 2009-09-15T20:01:17.427 に答える
2

うわー、あなたたちは最適化があまり得意ではありません。Perl では 63 文字でできますが、先頭に #!/usr/bin/perl を含めることを主張する場合は 79 文字でできます。

use Math::Big::Factors;
@f=factor_wheel($ARGV[0],1);
print @f;

(私をそのように見ないでください。献身的なプログラマーは怠惰なプログラマーです。)

于 2009-08-20T11:44:01.183 に答える
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--
  }
 }
}
于 2010-10-09T19:12:36.383 に答える
2

これは私の最高の仕事ではありませんが、83 文字の Haskell で回答します。

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

他にもできることはあると思いますが、今のところは問題ありません。

編集:キャラクターを削るために物事を再配置しました。効率は低下しますが、小さくなります。

于 2009-08-20T21:33:14.753 に答える
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);}}}'
于 2009-08-20T09:18:14.520 に答える
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
于 2009-09-15T21:11:45.803 に答える
2

74Python の 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
于 2011-12-07T06:42:35.067 に答える
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);}
于 2009-08-20T09:09:15.300 に答える
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]

どちらのバージョンも、最小の入力を除くすべての入力でスタック オーバーフローが発生する傾向があります。

于 2010-02-10T10:59:35.033 に答える
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 プログラムがあるはずです。

于 2009-08-20T08:28:24.290 に答える
0

Javascript、56

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"
于 2014-02-26T16:46:52.580 に答える
0

パイソン 3 163

結果を印刷せずに。

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))

于 2014-09-16T19:34:24.790 に答える