Este é um número de Smith?


28

Descrição do Desafio

Um número de Smith é um número composto cuja soma dos dígitos é igual à soma da soma dos dígitos de seus fatores primos. Dado um número inteiro N, determine se é um número Smith ou não.

Os primeiros números são Smith 4, 22, 27, 58, 85, 94, 121, 166, 202, 265, 274, 319, 346, 355, 378, 382, 391, 438(sequência A006753 em OEIS).

Entrada / saída de amostra

18: False (sum of digits: 1 + 8 = 9; factors: 2, 3, 3; sum of digits of factors: 2 + 3 + 3 = 8)
22: True
13: False (meets the digit requirement, but is prime)
666: True (sum of digits: 6 + 6 + 6 = 18; factors: 2, 3, 3, 37; sum of digits of factors: 2 + 3 + 3 + 3 + 7 = 18)
-265: False (negative numbers can't be composite)
0: False (not composite)
1: False (not composite)
4937775: True

Notas

  • Seu código pode ser uma função (método) ou um programa de trabalho completo,
  • Em vez de palavras como Truee False, você pode usar valores de verdade e falsidade, desde que fique claro o que são,
  • Este é um desafio de , portanto, faça seu código o mais curto possível!

6
Eu tive que ler o seguinte: "a soma dos dígitos é igual à soma da soma dos dígitos dos seus fatores primos" algumas vezes: P
Stewie Griffin

@StewieGriffin: Sim, é uma frase bastante complicado, mas eu senti que precisava dar uma definição adequada em vez de confiar exclusivamente nos exemplos :)
shooqie

2
Esta é uma daquelas perguntas em que pensei "Java + isto = não", mas votei na idéia: P
Shaun Wild

3
Às vezes, percebo padrões em números, soma de dígitos etc., mas, na verdade, as pessoas percebem coisas assim: "Albert Wilansky cunhou o termo número Smith quando notou a propriedade definidora no número de telefone do cunhado" ?
Stewie Griffin

1
@StewieGriffin: Sim, é como Ramanujan e 1729, sempre me confundiu também.
Shooqie 02/09/16

Respostas:


9

Geléia , 12 11 bytes

Æfḟȯ.DFżDSE

Retorna 1 para números de Smith e 0 caso contrário. Experimente online! ou verifique todos os casos de teste .

fundo

Æf(fatoração primária) e D(número inteiro em decimal) são implementados para que P(produto) e (número decimal em número inteiro) constituam inversos à esquerda.

Para os inteiros -4 a 4 , Æfretorna o seguinte.

-4 -> [-1, 2, 2]
-3 -> [-1, 3]
-2 -> [-1, 2]
-1 -> [-1]
 0 -> [0]
 1 -> []
 2 -> [2]
 3 -> [3]
 4 -> [2, 2]

Para os números -10, -1, -0,5, 0, 0,5, 1, 10 , Dretorna o seguinte.

-11   -> [-1, -1]
-10   -> [-1, 0]
 -1   -> [-1]
 -0.5 -> [-0.5]
  0   -> [0]
  0.5 -> [0.5]
  1   -> [1]
 10   -> [1, 0]
 11   -> [1, 1]

Como funciona

Æfḟȯ.DFżDSE  Main link. Argument: n (integer)

Æf           Yield the prime factorization of n.
  ḟ          Filter; remove n from its prime factorization.
             This yields an empty array if n is -1, 0, 1, or prime.
   ȯ.        If the previous result is an empty array, replace it with 0.5.
     D       Convert all prime factors to decimal.
      F      Flatten the result.
        D    Yield n in decimal.
       ż     Zip the results to both sides, creating a two-column array.
         S   Compute the sum of each column.
             If n is -1, 0, 1, or prime, the sum of the prime factorization's
             digits will be 0.5, and thus unequal to the sum of the decimal array.
             If n < -1, the sum of the prime factorization's digits will be
             positive, while the sum of the decimal array will be negative.
          E  Test both sums for equality.

2
Esta é uma solução muito legal, devo dizer!
Emigna

@Emigna - É o que eu fiz, mas implementado de uma forma muito superior: D
Jonathan Allan

@JonathanAllan Infelizmente eu não falo Jelly então eu não tenho idéia do que o seu código faz :)
Emigna

1
@ Emigna - sim, eu tinha planejado descobrir como jogar golfe antes de adicionar uma seção sobre como funciona.
Jonathan Allan

9

Python 2, 122 115 110 106 bytes

n=m=input()
s=0
for d in range(2,n):
 while n%d<1:n/=d;s+=sum(map(int,`d`))
print n<m>s==sum(map(int,`m`))

Guardado 4 bytes graças a Dennis

Experimente em ideone.com

Explicação

Lê um número em stdin e gera Truese o número for um número Smith ou Falsese não for.

n=m=input()                  # stores the number to be checked in n and in m
s=0                          # initializes s, the sum of the sums of digits of prime factors, to 0
for d in range(2,n):         # checks all numbers from 2 to n for prime factors
 while n%d<1:                # while n is divisible by d
                             #   (to include the same prime factor more than once)
  n/=d                       # divide n by d
  s+=sum(map(int,`d`))       # add the sum of the digits of d to s
print                        # print the result: "True" if and only if
      n<m                    #   n was divided at least once, i.e. n is not prime
      >                      #   and m>s (always true) and
      s==sum(map(int,`m`))   #   s is equal to the sum of digits of m (the input)

1
Abaixo eleitor - pode ser útil adicionar um comentário para explicar o porquê
Jonathan Allan

6
@JonathanAllan O voto negativo foi convertido automaticamente pelo usuário da Comunidade quando a resposta foi editada. Eu considero isso um bug .
Dennis

1
A última linha pode ser reescrita como print n<m>s==sum(map(int,`m`)).
Dennis

@ Dennis Esse é um ótimo uso da comparação encadeada!
LevitatingLion

8

Braquilog , 19 bytes

@e+S,?$pPl>1,P@ec+S

Experimente online!

Explicação

@e+S,                 S is the sum of the digits of the input.
     ?$pP             P is the list of prime factors of the input.
        Pl>1,         There are more than 1 prime factors.
             P@e      Split each prime factor into a list of digits.
                c     Flatten the list.
                 +S   The sum of this list of digits must be S.

2
@JonathanAllan Ele faz . Em Brachylog, o sinal negativo para números é _(chamado de menos menos ).
Fatalize 2/09/16

7

05AB1E , 11 17 bytes

X›0si¹ÒSO¹SOQ¹p_&

Explicação

X›0si              # if input is less than 2 then false, else
       SO          # sum of digits
     ¹Ò            # of prime factors with duplicates
            Q      # equal to
          SO       # sum of digits
         ¹         # of input
                &  # and
             ¹p_   # input is not prime

Experimente online!


5

PowerShell v3 +, 183 bytes

param($n)$b=@();for($a=$n;$a-gt1){2..$a|?{'1'*$_-match'^(?!(..+)\1+$)..'-and!($a%$_)}|%{$b+=$_;$a/=$_}}$n-notin$b-and(([char[]]"$n")-join'+'|iex)-eq(($b|%{[char[]]"$_"})-join'+'|iex)

Nenhuma verificação básica incorporada. Sem fatoração interna. Sem soma de dígitos incorporada. Tudo feito à mão. : D

Recebe a entrada $ncomo um número inteiro, define $bigual a uma matriz vazia. Aqui $bestá nossa coleção de fatores principais.

Em seguida é um forloop. Primeiro, definimos $aigual ao nosso número de entrada e a condicional é até que $aseja menor que ou igual a 1. Esse loop encontrará os principais fatores.

Fazemos um loop de 2até $a, uses Where-Object( |?{...}) para obter primos que também são fatores !($a%$_). Eles são alimentados em um loop interno |%{...}que coloca o fator $be se divide $a(assim, finalmente chegaremos a 1).

Então, agora temos todos os nossos principais fatores $b. Hora de formular nossa saída booleana. Precisamos verificar se $né -notin $b, porque se é que isso significa que $né primo, e por isso não é um número Smith. Além disso, ( -and) precisamos garantir que nossos dois conjuntos de somas de dígitos sejam -eqcomuns. O booleano resultante é deixado no pipeline e a saída é implícita.

NB - Requer v3 ou mais recente para o -notinoperador. Ainda estou executando a entrada para 4937775(isso é lento para calcular), então atualizarei isso quando terminar. Após mais de 3 horas, recebi um erro de stackoverflow. Então, há algum limite superior em algum lugar. Ah bem.

Isso funcionará para entrada negativa, zero ou uma, porque o lado direito da -andtela exibirá um erro enquanto tenta calcular as somas de dígitos (mostradas abaixo), o que fará com que essa metade seja $falseavaliada. Como STDERR é ignorado por padrão e a saída correta ainda é exibida, tudo bem.


Casos de teste

PS C:\Tools\Scripts\golfing> 4,22,27,58,85,94,18,13,666,-265,0,1|%{"$_ -> "+(.\is-this-a-smith-number.ps1 $_)}
4 -> True
22 -> True
27 -> True
58 -> True
85 -> True
94 -> True
18 -> False
13 -> False
666 -> True
Invoke-Expression : Cannot bind argument to parameter 'Command' because it is an empty string.
At C:\Tools\Scripts\golfing\is-this-a-smith-number.ps1:1 char:179
+ ... "$_"})-join'+'|iex)
+                    ~~~
    + CategoryInfo          : InvalidData: (:String) [Invoke-Expression], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.InvokeExpressionCommand

-265 -> False
Invoke-Expression : Cannot bind argument to parameter 'Command' because it is an empty string.
At C:\Tools\Scripts\golfing\is-this-a-smith-number.ps1:1 char:179
+ ... "$_"})-join'+'|iex)
+                    ~~~
    + CategoryInfo          : InvalidData: (:String) [Invoke-Expression], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.InvokeExpressionCommand

0 -> False
Invoke-Expression : Cannot bind argument to parameter 'Command' because it is an empty string.
At C:\Tools\Scripts\golfing\is-this-a-smith-number.ps1:1 char:179
+ ... "$_"})-join'+'|iex)
+                    ~~~
    + CategoryInfo          : InvalidData: (:String) [Invoke-Expression], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.InvokeExpressionCommand

1 -> False


3

Geléia , 27 25 23 bytes

(ainda mais golfe provavelmente definitivamente possível)

ḢDS×
ÆFÇ€SḢ
DS=Ça<2oÆP¬

Retorna 0para Falso ou 1Verdadeiro

Todos os casos de teste em TryItOnline

Quão?

DS=Ça<2oÆP¬ - main link takes an argument, n
DS          - transform n to a decimal list and sum up
   Ç        - call the previous link (ÆFÇ€SḢ)
  =         - test for equality
     <2     - less than 2?
    a       - logical and
        ÆP  - is prime?
       o    - logical or
          ¬ - not
            - all in all tests if the result of the previous link is equal to the digit
              sum if the number is composite otherwise returns 0.

ÆFÇ€SḢ - link takes an argument, n again
ÆF     - list of list of n's prime factors and their multiplicities
  Ç€   - apply the previous link (ḢDS×) for each
    S  - sum up
     Ḣ - pop head of list (there will only be one item)

ḢDS× - link takes an argument, a factor, multiplicity pair
Ḣ    - pop head, the prime factor - modifies list leaving the multiplicity
 DS  - transform n to a decimal list and sum up
   × - multiply the sum with the multiplicity

3

Na verdade, 18 bytes

Infelizmente, na verdade não há uma fatoração embutida que dê os principais fatores de um número à multiplicidade, então tive que cortar um juntos. Sugestões de golfe são bem-vindas. Experimente online!

;w`i$n`MΣ♂≈Σ@$♂≈Σ=

Ungolfing

         Implicit input n.
;w       Duplicate n and get the prime factorization of a copy of n.
`...`M   Map the following function over the [prime, exponent] lists of w.
  i        Flatten the list. Stack: prime, exponent.
  $n       Push str(prime) to the stack, exponent times.
            The purpose of this function is to get w's prime factors to multiplicity.
Σ        sum() the result of the map.
          On a list of strings, this has the same effect as "".join()
♂≈Σ      Convert every digit to an int and sum().
@        Swap the top two elements, bringing other copy of n to TOS.
$♂≈Σ     Push str(n), convert every digit to an int, and sum().
=        Check if the sum() of n's digits is equal 
          to the sum of the sum of the digits of n's prime factors to multiplicity.
         Implicit return.

3

Haskell, 120 105 bytes

1%_=[];a%x|mod a x<1=x:div a x%x|0<1=a%(x+1)
p z=sum[read[c]|c<-show z]
s x|z<-x%2=z<[x]&&sum(p<$>z)==p x

2

Oitava, 80 78 bytes

t=num2str(factor(x=input('')))-48;disp(any(t<0)&~sum([num2str(x)-48 -t(t>0)]))

Explicação:

factor(x=input(''))                 % Take input, store as x and factor it
num2str(factor(x=input('')))-48     % Convert it to an array (123 -> [1 2 3]) 
                                    % and store as t
any(t<0)                            % Check if there are several prime factors
                                    % [2 3] -> [2 -16 3]
sum([num2str(x)-48 -t(t>0)])        % Check if sum of prime factor
                                    % is equal the sum of digits

Experimente online .


1
Isso any(t<0)para não-primality é muito inteligente
Luis Mendo

2

Pitão, 21 bytes

&&>Q1!P_QqsjQTssmjdTP

Um programa que recebe a entrada de um número inteiro e imprime Trueou Falseconforme relevante.

Experimente online

Como funciona

&&>Q1!P_QqsjQTssmjdTP  Program. Input: Q
           jQT         Yield digits of the base-10 representation of Q as a list
          s            Add the digits
                    P  Yield prime factors of Q (implicit input fill)
                mjdT   Map base-10 representation across the above, yielding digits of each
                       factor as a list of lists
               s       Flatten the above
              s        Add up the digits
         q             Those two sums are equal
&                      and
  >Q1                  Q>1
 &                     and
     !P_Q              Q is not prime
                       Implicitly print

2

Perl 6 , 92 88 87 bytes

{sub f(\i){my \n=first i%%*,2..i-1;n??n~f i/n!!i}
!.is-prime&&$_>1&&.comb.sum==.&f.comb.sum}

{sub f(\i){my \n=first i%%*,2..^i;n??[n,|f i/n]!!|i}
$_>.&f>1&&.comb.sum==.&f.comb.sum}

Uma função anônima que retorna um Bool.

  • Agora faz 100% de fatoração manual e verificação de primalidade.
  • Economizou alguns bytes testando "entrada> 1" e "número de fatores> 1" com uma comparação encadeada, desde m> Ω (m) .

( experimente online )

EDIT: -1 byte graças a b2gills


2..i-1é melhor escrito como 2..^i.
Brad Gilbert b2gills

2

Java 7, 509 506 435 426 419 230 bytes

boolean c(int n){return n<2|p(n)?0>1:d(n)==f(n);}int d(int n){return n>9?n%10+d(n/10):n;}int f(int n){int r=0,i;for(i=1;++i<=n;)for(;n%i<1;n/=i,r+=i>9?d(i):i);return r;}boolean p(int n){int i=2;while(i<n)n=n%i++<1?0:n;return n>1;}

Eu deveria ter ouvido o comentário de @BasicallyAlanTuring ..

Essa é uma daquelas perguntas em que pensei "Java + this = no", mas votei na idéia: P

Ah, bem. Algumas linguagens de programação usam um único byte para os fatores primos ou para verificação principal, mas o Java certamente não é um deles.

Edição: metade da quantidade de bytes agora que eu tive algum tempo para pensar sobre isso.

Casos não testados (separação ..) e teste:

Experimente aqui.

class M{
  static boolean c(int n){
    return n < 2 | p(n)
            ? 0 > 1 //false
            : d(n) == f(n);
  }

  // Sums digits of int
  static int d(int n) {
    return n > 9
            ? n%10 + d(n/10)
            : n;
  }

  // Convert int to sum of prime-factors
  static int f(int n) {
    int r = 0,
        i;
    for(i = 1; ++i <= n; ){
      for( ; n % i < 1; n /= i,
                        r += i > 9 ? d(i) : i);
    }
    return r;
  }

  // Checks if the int is a prime
  static boolean p(int n){
    int i = 2;
    while(i < n){
      n = n % i++ < 1
           ? 0
           : n;
    }
    return n > 1;
  }

  public static void main(String[] a){
    System.out.println(c(18));
    System.out.println(c(22));
    System.out.println(c(13));
    System.out.println(c(666));
    System.out.println(c(-256));
    System.out.println(c(0));
    System.out.println(c(1));
    System.out.println(c(4937775));
  }
}

Saída:

false
true
false
true
false
false
false
true

2

Brachylog (mais recente) , 11 bytes

¬ṗ&ẹ+.&ḋcẹ+

Experimente online!

O predicado é bem-sucedido se a entrada for um número Smith e falhar se não for.

               The input
¬ṗ             is not prime,
  &            and the input's 
   ẹ           digits
    +          sum to
     .         the output variable,
      &        and the input's 
       ḋ       prime factors' (getting prime factors of a number < 1 fails)
        c      concatenated
         ẹ     digits
          +    sum to
               the output variable.



1

Pyke, 16 bytes

Pm[`mbs(sQ[qRlt*

Experimente aqui!


1
Erros sem resultado para entrada menor que #2
Jonathan Allan

@ JonathanAllan nenhuma saída para o stdout é falsa. Se os avisos são desativados stderr fica ignorado demasiado
azul

Eu sabia que podemos ignorar o stderr, mas nenhuma saída parece um pouco estranha ... mas se é aceitável, então é aceitável.
Jonathan Allan

Pessoalmente, não tenho certeza se é aceitável, mas posso dizer que está certo?
Blue

1

Perl 6 , 80 bytes

{.[0]==.flat.skip.sum}o($!={.comb.sum,($/=first $_%%*,2..^$_)&&map $!,$/,$_/$/})

Experimente online!

Bloco de código anônimo que pega um número inteiro e retorna um booleano.


1

APL (Dyalog Extended) , 36 29 bytes SBCS

Essa resposta deve sua capacidade à mônada do Extended por retornar os fatores primos de um número, e isso é melhor na conversão de base do que no Dyalog Unicode.

Edit: -7 bytes graças ao dzaima.

{2>⍵:0⋄(⊃=+/-⊃×2<≢)+⌿10⊤⍵,⍭⍵}

Experimente online!

Explicação

{1⋄(3)2}  A dfn, a function in brackets.  is a statement separator.
          The numbers signify the sections in the order they are explained.

2>⍵:0  If we have a number less than 2,
       we immediately return 0 to avoid a DOMAIN ERROR.

+⌿10⊤⍵,⍭⍵
        ⍭⍵  We take the factors of ⍵, our input as our right argument,
      ⍵,    and append it to our input again.
   10      before converting the input and its factors into a matrix of their base-10 digits
            (each row is the places, units, tens, hundreds, etc.)
+⌿         And taking their sum across the columns of the resulting matrix,
            to give us the sum of their digits, their digit-sums.

(⊃=+/-⊃×2<≢)  We run this section over the list of sums of digits above.
 ⊃=+/-⊃       We check if the main digit-sum (of our input)
               Is equal to the sum of our digit-sums
               (minus our main digit-sum that is also still in the list)
        ×2<≢   The trick here is that we can sneak in our composite check
               (if our input is prime there will be only two numbers, 
               the digit-sum of the prime,
               and the digit-sum of its sole prime factor, itself)
               So if we have a prime, we zero our (minus our main sum)
               in the calculation above, so that primes will not succeed in the check.
               We return the result of the check.

29 bytes -{2>⍵:0⋄(⊃=+/-⊃×2<≢)+⌿10⊤⍵,⍭⍵}
dzaima 3/03


1

C (gcc) , 139 136 bytes

S(m,i,t,h,_){t=m=m<2?2:m;for(_=h=i=1;m>1;h=1){while(m%++h);for(m/=h;i+=h%10,h/=10;);}while(t%++h);for(m=t;_+=m%10,m/=10;);m=t-h?i==_:0;}

Experimente online!

-3 bytes graças a ceilingcat

Explicação:

/* 
 * Variable mappings:
 *  is_smith      => S
 *  argument      => m
 *  factor_digits => i
 *  arg_copy      => t
 *  least_factor  => h
 *  digit_sum     => _    
 */
int is_smith(int argument){                     /* S(m,i,t,h,_){ */
    int factor_digits;
    int arg_copy;
    int least_factor;
    int digit_sum;

    /* 
     * The cases of 0 and 1 are degenerate. 
     * Mapping them to a non-degenerate case with the right result.
     */
    if (argument < 2) {                         /* t=m=m<2?2:m; */
        argument = 2;
    }
    arg_copy = argument;

    /* 
     * Initializing these to 1 instead of zero is done for golf reasons.
     * In the end we just compare them, so it doesn't really matter.
     */
    factor_digits = 1;                          /* for(_=h=i=1; */
    digit_sum = 1;

    /* Loop over each prime factor of argument */
    while (argument > 1) {                      /* m>1; */

        /*
         * Find the smallest factor 
         * Note that it is initialized to 1 in the golfed version since prefix
         * increment is used in the modulus operation.
         */
        least_factor = 2;                       /* h=1){ */
        while (argument % least_factor != 0)    /* while(m% */
            least_factor++;                     /* ++h); */
        argument /= least_factor;               /* for(m/=h; */

        /* Add its digit sum to factor_digits */
        while (least_factor > 0) {
            factor_digits += least_factor % 10; /* i+=h%10, */
            least_factor /= 10;                 /* h/=10;) */
        }                                       /* ; */

    }                                           /* } */

    /* In the golfed version we get this for free in the for loop. */
    least_factor = 2;
    while (arg_copy % least_factor != 0)        /* while(t% */
        least_factor++;                         /* ++h); */

    /* Restore the argument */
    argument = arg_copy;                        /* for(m=t; */

    /* Compute the arguments digit sum */
    while (argument > 0) {
        digit_sum += argument % 10;             /* _+=m%10, */
        argument /= 10;                         /* m/=10;) */
    }                                           /* ; */

    /* This return is done by assigning to first argument when golfed. */
                                                /* m= */
    if (arg_copy == least_factor) {             /* t==h? */
        return 0; /* prime input */             /* 0 */
    } else {                                    /* : */
        return digit_sum == factor_digits;      /* i == _ */
    }                                           /* ; */
}                                               /* } */

Isso introduziu alguns bugs (por exemplo, 2 e 3), mas acho que ainda deve ser possível.
LambdaBeta 26/04

Sugerir em t-h&&i==_vez det-h?i==_:0
ceilingcat

0

Raquete 176 bytes

(define(sd x)(if(= x 0)0(+(modulo x 10)(sd(/(- x(modulo x 10))10)))))
(require math)(define(f N)
(if(=(for/sum((i(factorize N)))(*(sd(list-ref i 0))(list-ref i 1)))(sd N))1 0))

Retorna 1 se verdadeiro e 0 se falso:

(f 27)
1
(f 28)
0
(f 85)
1
(f 86)
0

Versão detalhada:

(define (sd x)   ; fn to find sum of digits
  (if (= x 0)
      0
      (+ (modulo x 10)
         (sd (/ (- x (modulo x 10)) 10)))))

(require math)
(define (f N)
  (if (= (for/sum ((i (factorize N)))
           (* (sd (list-ref i 0))
              (list-ref i 1)))
         (sd N)) 1 0))

0

Ferrugem - 143 bytes

fn t(mut n:u32)->bool{let s=|k:u32| (2..=k).fold((0,k),|(a,m),_|(a+m%10,m/10));s(n).0==(2..n).fold(0,|mut a,d|{while n%d<1{n/=d;a+=s(d).0};a})}

solução python emprestada por @levitatinglion ... pelo menos isso é mais curto que Java ...

degolfado em play.rust-lang.org


0

APL (NARS), 33 caracteres, 66 bytes

{1≥≢k←π⍵:0⋄s←{+/⍎¨⍕⍵}⋄(s⍵)=+/s¨k}

"π⍵" retorna os fatores da lista de ⍵, suponha que a entrada seja um número inteiro positivo> = 1; teste:

  h←{1≥≢k←π⍵:0⋄s←{+/⍎¨⍕⍵}⋄(s⍵)=+/s¨k}
  (h¨1..100)/1..100
4 22 27 58 85 94 

0

C (gcc), 177 bytes

Define uma função Qque retorna 0 para números smith e diferente de zero para números não smith

#define r return
O(D,i){for(i=0;D>0;i+=D%10,D-=D%10,D/=10);r i;}D(O,o){for(o=1;o<O;)if(O%++o<1)r o;r O;}Q(p,q,i,j){if(p^(q=D(i=p))){for(j=0;p>1;q=D(p/=q))j+=O(q);r j^O(i);}r 1;}

Experimente online!

Explicação:

// Return the sum of digits of D if D > 0, otherwise 0
O(D,i){
    // While D is greater than 0:
    // Add the last digit of D to i, and remove the last digit from D
    for(i=0;D>0;i+=D%10,D-=D%10,D/=10);
    return i;
}
// Return the smallest prime factor of O if O>1 else O
D(O,o){
    // Iterate over numbers less than O
    for(o=1;o<O;)
        // If O is divisible by o return o
        if(O%++o<1)
            return o;
    // Otherwise return O
    return O;
}
Q(p,q,i,j){
    // Set q to D(p) and i to p
    // If p != D(p) (i.e, p is composite and > 0)
    if(p^(q=D(i=p))){
        // Iterate over the prime factors of p and store their digit sum in j
        for(j=0;p>1;q=D(p/=q))
            j+=O(q);
        // i is the original value of p. If O(i)^j == 0, O(i) == j
        return j^O(i);
    }
    // If p was composite or < 0, return 1
    return 1;
}


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.