2012-05-11 1 views
-1

Проблема заключается в следующем:Недружелюбные Числа от Interviewstreet.com

There is one friendly number and N unfriendly numbers. We want to find how many numbers are there which exactly divide the friendly number, but does not divide any of the unfriendly numbers. 

Input Format: 
The first line of input contains two numbers N and K seperated by spaces. N is the number of unfriendly numbers, K is the friendly number. 
The second line of input contains N space separated unfriendly numbers. 

Output Format: 
Output the answer in a single line. 

Constraints: 
1 <= N <= 10^6 
1 <= K <= 10^13 
1 <= unfriendly numbers <= 10^18 

Sample Input: 
8 16 
2 5 7 4 3 8 3 18 

Sample Output: 
1 

Explanation : 
Divisors of the given friendly number 16, are { 1, 2, 4, 8, 16 } and the unfriendly numbers are {2, 5, 7, 4, 3, 8, 3, 18}. Now 1 divides all unfriendly numbers, 2 divide 2, 4 divide 4, 8 divide 8 but 16 divides none of them. So only one number exists which divide the friendly number but does not divide any of the unfriendly numbers. So the answer is 1. 

Ниже мой C раствор #:

class Solution 
{ 
    static void Main(string[] args) 
    { 
     string firstLine = Console.ReadLine(); 
     string[] firstLineItems = firstLine.Split(' '); 

     ulong friendlyNum = Convert.ToUInt64(firstLineItems[1]); 
     int noOfunf = Convert.ToInt32(firstLineItems[0]); 

     string secondLine = Console.ReadLine(); 
     string[] secondLineItems = secondLine.Split(' '); 

     List<ulong> unfriendlyNumbersArray = new List<ulong>(noOfunf); 

     foreach (string str in secondLineItems) 
     { 
      unfriendlyNumbersArray.Add(Convert.ToUInt64(str)); 
     } 

     List<ulong> divisors = CalculateDivisors(friendlyNum); 

     Console.WriteLine(finalCall(divisors, unfriendlyNumbersArray)); 
    } 

    private static List<ulong> CalculateDivisors(ulong number) 
    { 
     List<ulong> factors = new List<ulong>(); 

     for (ulong factor = 1; factor * factor <= number; ++factor) 
     { 
      if (number % factor == 0) 
      { 
       factors.Add(factor); 
       if (factor * factor != number) 
       { 
        factors.Add(number/factor); 
       } 
      } 
     } 
     return factors; 
    } 

    private static long finalCall(List<ulong> divisors, List<ulong> unfriendlyNumbersArray) 
    { 
     long output = 0; 
     var unfriendlyNumbers = (from i in unfriendlyNumbersArray select i).Distinct(); 

     foreach (ulong divisor in divisors) 
     { 
      var test = unfriendlyNumbers.Where(number => number % divisor == 0).ToList(); 
      output += (test.Count == 0) ? 1 : 0; 
     } 
     return output; 
    } 
} 

только первые 3 тестовых случаев проходят. 4-й убит, 5-й и 6-й - дает мне разбор исключений для строки.

Исключение для 5-го и 6-м из них:

Unhandled Exception: System.FormatException: Input string was not in the correct format 
    at System.UInt64.Parse (System.String s) [0x00000] in :0 
    at System.Convert.ToUInt64 (System.String value) [0x00000] in :0 
    at Solution.Main (System.String[] args) [0x00000] in :0 
    [ERROR] FATAL UNHANDLED EXCEPTION: System.FormatException: Input string was not in the  correct format 
    at System.UInt64.Parse (System.String s) [0x00000] in :0 
    at System.Convert.ToUInt64 (System.String value) [0x00000] in :0 
    at Solution.Main (System.String[] args) [0x00000] in :0 
+2

Вы должны сначала отладить это самостоятельно; шаг за шагом; в точке это ошибки (один из Convert.ToUInt64), каков вход? то есть 'str' или' firstLineItems [1] '(в зависимости от того, где происходит исключение). Сначала отлаживаем, ** затем ** спрашиваем ... –

+0

Привет, Марк, я полностью согласен с вами. Однако у меня нет ввода со мной. Эти тестовые примеры не передаются в интервьюstreet.com. Вот почему я должен был задать этот вопрос так грубо. Простите за это. – vekay

+0

да, но если * вы * не можете отлаживать его, потому что у вас нет данных, почему вы ожидаете, что мы * придумаем * данные, не соответствующие данным? –

ответ

0

Я был в состоянии решить эту проблему на основании следующих link. Я был очень поражен глубоким пониманием теории чисел автора вышеупомянутой ссылки. В приведенном выше алгоритме нет ничего плохого. просто он не решит проблему в течение 5 секунд, ограничение, которое мы соблюдаем.

1

Вы должны использовать перегрузку Split который принимает параметр StringSplitOptions и передать RemoveEmptyEntries. В противном случае, если вход разделен несколькими пробелами, массив содержит пустые строки, которые не могут быть проанализированы.

Смежные вопросы