Problema del proyecto EULER # 3 -- python campo con beginner campo con programming-challenge camp codereview Relacionados El problema

Euler Project problem #3


5
vote

problema

Español

Problema: ¿Cuál es el factor primordial más grande del número 600851475143?

Hola, soy realmente nuevo con Python. ¿Alguien puede darme algún comentario para este código? Parece que produce la respuesta correcta

  a=600851475143 x=2 while x<(a/x):     if a%x==0: a=a/x     else: x+=1  print a   

Original en ingles

Problem: What is the largest prime factor of the number 600851475143?

Hi, I'm really new with Python. Can anyone give me some feedback for this code? it seem to produce the correct answer

a=600851475143 x=2 while x<(a/x):     if a%x==0: a=a/x     else: x+=1  print a 
        
 
 

Lista de respuestas

10
 
vote
vote
La mejor respuesta
 

Produce la respuesta correcta en este caso particular, pero no produciría la respuesta correcta para todas las entradas. Considere a=4 . La primera vez que llega al while Guard, x es 9988777665544333 y a/x es 2 , por lo que se omite el bucle y las impresiones 4 .

¿Hay algún motivo para usar un op= para x+=1 pero no para a=a/x ?

No soy un pithonista, pero estoy bastante seguro de que es un estilo preferido para poner el 99887766655443310 y while1 bloques en una nueva línea Incluso si solo son Una línea de largo:

  while2  
 

It produces the right answer in this particular case, but it wouldn't produce the right answer for all inputs. Consider a=4. The first time you hit the while guard, x is 2 and a/x is 2, so it skips the loop and prints 4.

Is there any reason for using an op= construct for x+=1 but not for a=a/x?

I'm not a Pythonista, but I'm pretty sure it's preferred style to put the if and else blocks on a new line even if they're only one line long:

    if a%x==0:         a/=x     else:         x+=1 
 
 
 
 
6
 
vote

Está haciendo una división innecesaria cada vez que los ciclos de bucle:

  while3  

Para evitar esto, puede definir una tercera variable y solo configúrelo cuando while4 CAMBIOS.


while5 puede ser un cuadrado perfecto, como Peter Taylor mencionado. Para devolver la respuesta correcta en este caso, use:

  while6  

Está comparando un valor cambiante a otro valor cambiante. 'X' sube mientras 'A / X' baja para alcanzarlo. Esto funciona bien, pero hace que sea difícil estimar cuánto tiempo se ejecutará el bucle.

  while7  

es equivalente a:

  while8  

Esto deja claro que, si while9 nunca es igual a x0 , el bucle continuará ejecutándose hasta que x alcance $ sqrt {a} $. Esto sucede para la entrada principal, por ejemplo. a = 600851475149.


PEP8 recomienda rodear a los operadores binarios (=, ==, + =, etc.) con un solo espacio a cada lado. Para los operadores direccionales (*, /, -, +,%), se utilizan espacios para hacer que el orden de las operaciones se aclare (por ejemplo, x1 ). En su caso, no hay un orden de operaciones de que se preocupe, por lo que puede dejar el espaciado alrededor de x2 y 99887766555443323 tal como es.

Agregando las mejoras sugeridas por Peter Taylor y Resultados:

  x4  

que es inmediatamente reconocible como una correcta implementación de la división de prueba. Es matemáticamente equivalente a los suyos (excepto el caso del borde de los cuadrados Peter Taylor manchado), ¡así, gran trabajo!

 

You are doing an unnecessary division every time the loop cycles:

    while x<(a/x): 

To avoid this, you can define a third variable and only set it when a changes.


a may be a perfect square, as Peter Taylor mentioned. To return the correct answer in this case, use:

    while x <= (a/x): 

You are comparing a changing value to another changing value. 'x' goes up while 'a/x' comes down to meet it. This works fine, but makes it hard to estimate how long the loop will run for.

    x < (a / x) 

Is equivalent to:

    x < sqrt(a) 

This makes it clear that, if a % x never equals 0, the loop will continue to run until x reaches \$\sqrt{a}\$. This happens for prime input, e.g. a = 600851475149.


PEP8 recommends surrounding binary operators (=, ==, +=, etc.) with a single space on either side. For directional operators (*, /, -, +, %), spaces are used to make the order of operations clear (for example, a*b + c*d). In your case, there is no order of operations to worry about, so you can leave the spacing around / and % as it is.

Adding the improvements suggested by Peter Taylor and Graipher results in:

from math import sqrt  a = 600851475143 sqrt_a = sqrt(a) x = 2 while x <= sqrt_a:     if a%x == 0:         a /= x         sqrt_a = sqrt(a)     else:         x += 1 print a 

Which is immediately recognizable as a correct implementation of trial division. It's mathematically equivalent to yours (except the edge case of squares Peter Taylor spotted), so, great job!

 
 

Relacionados problema

6  Encontrar el siguiente palíndromo de una cadena de números  ( Finding the next palindrome of a number string ) 
Aquí está el problema: Un entero positivo se llama palíndromo si su representación en el El sistema decimal es el mismo cuando se lee de izquierda a dere...

6  Las vocales en una cadena están en orden alfabético  ( Vowels in a string are in alphabetical order ) 
Tarea Escriba una implementación que devuelva si un 99887776655544330 tiene vocales (idioma inglés) en orden alfabético (A-Z) o no. Feedback es mi v...

6  Solución de codewars a "ascensor simple"  ( Codewars solution to simple elevator ) 
Soy nuevo en la programación (menos de un año), y me gustaría mejorar. Resolví un problema en las claquinas y copié tanto mi solución como la solución venci...

1  Codificación de Google Jam: Tienda Credit Java Solution  ( Google code jam store credit java solution ) 
Sería genial si pudiera obtener este código revisado. Me encantaría consejos sobre cómo podría mejorar mi código. problema Recibirá un crédito C en una...

56  Proyecto Euler Problema 1 en Python - Múltiples de 3 y 5  ( Project euler problem 1 in python multiples of 3 and 5 ) 
Me gustaría sugerencias para optimizar esta solución de fuerza bruta a problema 1 . El algoritmo actualmente comprueba cada entero entre 3 y 1000. Me gustarí...

6  Proyecto EULER # 7: 10001ST PRIME  ( Project euler 7 10001st prime ) 
Esta es mi implementación de Project Euler # 7 . ¿Lo he exagerado de nuevo? ¿Hay algo más que debería o no debo hacer? Se ejecuta en 9 milisegundos en mi com...

61  Uso de funciones separadas para Project Euler 1  ( Using separate functions for project euler 1 ) 
Comencé a programar con Java y C ++, así que estoy acostumbrado a tener una función "principal" que llama a otras funciones que realizan el trabajo real. En l...

4  Encuentre el número de subcadenas de una cadena numérica mayor que una cadena numérica dada  ( Find the number of substrings of a numerical string greater than a given num str ) 
Pregunta: http://qa.geeksforgeeks.org/9744/vinay-queried-interesting -Problem-optimización Entrada La primera línea contiene n que denota la longitud...

5  Cuatro cuatro para obtener cualquier número  ( Four fours to get any number ) 
Decidí resolver un problema de Código Golf llamado los cuatro cuatro . Descripción del problema: El Puzzle Four Fours es un popular rompecabezas matemát...

5  Proyecto EULER NO. 17: contando letras para escribir los números de 1 a 1000  ( Project euler no 17 counting letters to write the numbers from 1 to 1000 ) 
Soy muy nuevo en la programación y, cierto, estoy avergonzado de compartir mi código para la crítica. Este código funciona y produce la respuesta correcta a l...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos