2015-07-28 2 views
0

Я улучшаю свои навыки на C#, и теперь я пишу код для нахождения самого большого коэффициента числа. Тем не менее, ничего не отображаетсякод для поиска самого большого коэффициента по числу

static void Main(string[] args) 
{ 
    Int64 a = 600851475143; 
    List<Int64> dividers = new List<Int64>(); 
    for (Int64 b = 2; b < a; b++) 
    { 
     if (a % b == 0) 
     { 
      dividers.Add(b); 
     } 
    } 
    Int64 max = dividers.Max(); 
    Console.WriteLine(max); 
    Console.ReadLine(); 
} 
+0

попробуйте установить точку останова на строке 'Console.WriteLine (max);' и посмотреть, есть ли 'divers' какие-либо значения, а также' max'. Кроме того, вы можете остановить свой цикл на 'b

+0

Чтобы быть более эффективным, вы можете ограничить свой цикл до sqrt (a). В этом случае каждый раз, когда вы находите делитель x, также сохраняете в делителях y = a/x – Graffito

ответ

0

Ваша программа работает отлично - это просто берет действительно долгое время для выполнения. Вам нужно найти более эффективное средство для этого.

Трюк, который вы можете использовать, состоит только в том, чтобы учитывать только квадратный корень - факторы всегда попадают парами.

Int64 a = 600851475143; 
List<Int64> dividers = new List<Int64>(); 
for (Int64 b = 2; b <= Math.Sqrt(a); b++) 
{ 
    if (a % b == 0) 
    { 
     dividers.Add(b); 
     dividers.Add(a/b); 
    } 
} 
Int64 max = dividers.Max(); 

Вы можете еще больше улучшить это - вы можете вместо того, чтобы список всех факторов, просто следить за самого большого видели до сих пор.

+0

Лучше всего сказать «if (a% b == 0) { divers.Add (b); a/= b; } '. Тем не менее, это даст только разделители _prime_ исходного номера. Однако нетрудно понять, как исходить оттуда. –

0

Зная теперь, что вы пытаетесь решить Euler Problem 3 Я не собираюсь давать прямой ответ.

Что следует учесть при решении этой проблемы:

## 1 ## Вам нужно только проверить на SQRT() из этого числа.

double limit = Math.Sqrt(number); 
for (int i = 2; i <= limit; i++) 
функция

## 2 ## IsPrime

public static bool IsPrime(long number) 
{ 
    if ((number & 1) == 0) 
    { 
     return number == 2; 
    } 

    double limit = Math.Sqrt(number); 
    for (int i = 3; i <= limit; i += 2) 
    { 
     if ((number % i) == 0) 
     { 
      return false; 
     } 
    } 

    return number != 1; 
} 

## 3 ## Если вы нашли фактор (a % b == 0), проверьте, если б или (а/б) являются простыми и удерживайте самую большую, которая превышает известный в настоящее время наибольший простой коэффициент

+0

Спасибо @ Shar1er80 Это только часть проблемы. Я просто решал проблему проекта эйлеров, которая является Основными факторами 13195 являются 5, 7, 13 и 29. Какой самый большой простой коэффициент числа 600851475143? – BGA

+0

@BGA Ahh! Хорошие проекты Ole Euler. Ну, я не хочу просто предоставлять вам, но у вас должно быть то, что вам нужно для решения проблемы Эйлера 3 сейчас. Прежде всего, алгоритм первичной проверки, который вы использовали бы, чтобы проверить, являются ли найденные факторы (b & a/b) первичными. – Shar1er80