martes, 18 de octubre de 2011

Raíz Digital Prima

Raíz Digital Prima
La raíz digital de un número es hallado adicionando todos lo dígitos en un número. Si el número resultante tiene más de un dígito, el proceso es repetido hasta temer un simple dígito.

Tu trabajo en este problema es calcular una variación de la raíz digital – una raíz digital prima. El proceso de adición descrito arriba para cuando solo queda un dígito, pero podemos para en el número original, o en cualquier número intermedio (formado por la adición) que sea número primo.

Si el proceso continúa y el resultado es un dígito que no es primo, entonces el número original no tiene raíz digital prima.
Un entero mayo que uno es llamado número primo si tiene solo dos divisores, el uno y si mismo.

· Por ejemplo, los primeros seis primos son 2, 3, 5, 7, 11, y 13.
· El número 6 tiene cuatro divisores: 6, 3, 2, y 1. Por eso 6 no es primo.
· Advertencia: en número 1 no es primo.

EJEMPLOS DE RAIZ DIGITAL PRIMA
1 Este no es un número primo, así que 1 no tiene raíz digital prima.
3 Este es un número primo, así que la raíz digital prima de 3 es 3.
4 Este no es un número primo, así que 4 no tiene raíz digital prima.
11 Este es un número primo, así que la raíz digital prima de 11 es 11.
642 Este no es un número primo, así que sumando 6 +4 + 2 = 12. Este no es un número primo, así que
sumando 1 + 2 = 3. Este si es un número primo, así que la raíz digital prima de 642 es 3.
128 Este no es un número primo, así que sumando 1 +2 + 8 = 11. Este es un número primo, así que la raíz
digital prima de 128 es 11.
886 Este no es un número primo, así que sumando 8 + 8 + 6 = 22. Este no es un número primo, así que sumando 2 + 2 = 4. Este no es un número primo, así que 886 no tiene raíz digital prima.

Entrada
La entrada contendrá un entero en cada línea en el rango
de 0 a 999999 inclusive. El fin de la entrada se indica con el
valor 0.
Salida
Si el número ingresado tiene raíz digital prima, entonces se
debe desplegar el valor original y el valor de la raíz digital
prima, caso contrario se despliega el valor original seguido
por la palabra “none”, los valores deben estar alineados con
una justificación derecha de 7 espacios, como se muestra
en el ejemplo de salida.

Ejemplo de entrada
134
11
642
128
886
0
Ejemplo de salida
1 none
3 3
4 none
11 11
642 3
128 11
886 none
Nota: la salida tiene el siguiente formato:
111111
123456789012345
4 none
642 3

SOLUCION
<?php
$num = str_replace("\n", "", fgets(STDIN));
while($num!=0){
  $raizPrima=$num;
  if ($num>1){
    if (!isPrime($num)){
      $raizPrima=raizPrima($num);
    } else {
      $raizPrima=$num;
    }
  } else{
    $raizPrima='none';
  }
  echo str_repeat(' ', 7-strlen($num)).$num.str_repeat(' ', 8-strlen($raizPrima)).$raizPrima."\n";
  $num = str_replace("\n", "", fgets(STDIN));
}
function raizPrima($num){
 $sw=true;
 $resp='none';
  while(strlen($num)>1 && $sw)  {
    $k=0;
    for($i=0;$i<strlen($num);$i++)
      $k=$k+$num[$i];
    if (!isPrime($k))
      $num=(string)$k;
    else {
      $resp=$k;
      $sw=false;
    }
  }
  return($resp);
}
function isPrime($num)
{
  $cont = 0;
  for($i = 1; $i <= $num; $i++){
    if($num % $i == 0)
      $cont++;
  }
  if($cont==2)
    return true;
  else
    return false;

?>

miércoles, 12 de octubre de 2011

Números Casi Primos (Almost Primes Numbers)

Los números casi primos son número no-primos que son
divisibles por solo un número primo. En este problema tu
trabajo es escribir un programa que encuentre la cantidad
de número casi primos dentro de cierto rango.
Entrada
La primera línea de la entrada contiene un entero N (N<=
600) que indica cuantos sets de datos siguen. Cada una de
las siguientes N líneas es un set de entrada. Cada set
contiene dos número enteros low y high (0 < low<= high <
1012).
Salida
Por cada línea de entrada excepto la primera usted debe
producir una línea de salida. Esta línea contendrá un entero,
que indica cuantos números casi primos hay dentro del
rango(incluyendo) low . . . high.
Ejemplo de entrada
3
1 10
1 20
1 5
Ejemplo de salida
3
4
1
Solución (en php):
<?php
$n=str_replace("\n", "", fgets(STDIN));
//$n=3;
for ($i=0;$i<$n;$i++)
{
  $sequence=str_replace("\n", "", fgets(STDIN));
  list($ini,$fin)=explode(" ",$sequence);
  $z=0;
  for($j=$ini;$j<=$fin;$j++)
  {
    if(!isPrime($j)){
      if (almostPrime($j))
      {
        $z++;
      }
    }
  }
  //echo $ini;
  //echo $fin;
  echo $z."\n";
}
function isPrime($num)
{
  $cont = 0;
  for($i = 1; $i <= $num; $i++){
    //echo 3/2.”<br>”;
    if($num % $i == 0){
      //echo “$i <br>”;
      $cont++;
    }
  }
   
  if($cont==2){
    return true;
  }else{
    return false;
  }
}
function almostPrime($num)
{
  $cont =0;
  for($i = 1; $i <= $num; $i++){
    if (isPrime($i)){
      if ($num%$i == 0){
        $cont++;
      }
    }
  }
  if($cont==1){
    return true;
  }else{
    return false;
  }
}
?>