Дефицитен номер

Дефицитен номер
Опитайте в GfG Practice #practiceLinkDiv { display: none !important; }

За число n се казва, че е дефектно число, ако сумата от всички делители на числото, означено с делителиСума(n) е по-малко от два пъти стойността на числото n. И разликата между тези две стойности се нарича дефицит .
Математически, ако условието по-долу е изпълнено, числото се счита за недостатъчно: 
 

  divisorsSum(n)  < 2 * n     deficiency   = (2 * n) - divisorsSum(n) 


Първите няколко дефицитни числа са:
1 2 3 4 5 7 8 9 10 11 13 14 15 16 17 19 .....
Дадено е число n, нашата задача е да открием дали това число е Дефицитно число или не. 
Примери:  
 

Input: 21 Output: YES Divisors are 1 3 7 and 21. Sum of divisors is 32. This sum is less than 2*21 or 42. Input: 12 Output: NO Input: 17 Output: YES 


 

Препоръчителна практика Дефицитен номер Опитайте!


А Просто решение е да итерирате всички числа от 1 до n и да проверите дали числото дели n и да изчислите сумата. Проверете дали тази сума е по-малка от 2 * n или не.
Времева сложност на този подход: O ( n )
Оптимизирано решение:  
Ако наблюдаваме внимателно, делителите на числото n присъстват по двойки. Например, ако n = 100, тогава всички двойки делители са: (1 100) (2 50) (4 25) (5 20) (10 10)
Използвайки този факт, можем да ускорим нашата програма. 
Докато проверяваме делителите, ще трябва да внимаваме дали има два равни делителя, както в случая на (10 10). В такъв случай ще вземем само един от тях при изчисляване на сумата.
Прилагане на оптимизиран подход 
 

C++
   // C++ program to implement an Optimized Solution   // to check Deficient Number   #include          using     namespace     std  ;   // Function to calculate sum of divisors   int     divisorsSum  (  int     n  )   {      int     sum     =     0  ;     // Initialize sum of prime factors      // Note that this loop runs till square root of n      for     (  int     i     =     1  ;     i      <=     sqrt  (  n  );     i  ++  )     {      if     (  n     %     i     ==     0  )     {      // If divisors are equal take only one      // of them      if     (  n     /     i     ==     i  )     {      sum     =     sum     +     i  ;      }      else     // Otherwise take both      {      sum     =     sum     +     i  ;      sum     =     sum     +     (  n     /     i  );      }      }      }      return     sum  ;   }   // Function to check Deficient Number   bool     isDeficient  (  int     n  )   {      // Check if sum(n)  < 2 * n      return     (  divisorsSum  (  n  )      <     (  2     *     n  ));   }   /* Driver program to test above function */   int     main  ()   {      isDeficient  (  12  )     ?     cout      < <     'YES  n  '     :     cout      < <     'NO  n  '  ;      isDeficient  (  15  )     ?     cout      < <     'YES  n  '     :     cout      < <     'NO  n  '  ;      return     0  ;   }   
Java
   // Java program to check Deficient Number   import     java.io.*  ;   class   GFG     {      // Function to calculate sum of divisors      static     int     divisorsSum  (  int     n  )      {      int     sum     =     0  ;     // Initialize sum of prime factors      // Note that this loop runs till square root of n      for     (  int     i     =     1  ;     i      <=     (  Math  .  sqrt  (  n  ));     i  ++  )     {      if     (  n     %     i     ==     0  )     {      // If divisors are equal take only one      // of them      if     (  n     /     i     ==     i  )     {      sum     =     sum     +     i  ;      }      else     // Otherwise take both      {      sum     =     sum     +     i  ;      sum     =     sum     +     (  n     /     i  );      }      }      }      return     sum  ;      }      // Function to check Deficient Number      static     boolean     isDeficient  (  int     n  )      {      // Check if sum(n)  < 2 * n      return     (  divisorsSum  (  n  )      <     (  2     *     n  ));      }      /* Driver program to test above function */      public     static     void     main  (  String     args  []  )      {      if     (  isDeficient  (  12  ))      System  .  out  .  println  (  'YES'  );      else      System  .  out  .  println  (  'NO'  );      if     (  isDeficient  (  15  ))      System  .  out  .  println  (  'YES'  );      else      System  .  out  .  println  (  'NO'  );      }   }   // This code is contributed by Nikita Tiwari   
Python3
   # Python program to implement an Optimized    # Solution to check Deficient Number   import   math   # Function to calculate sum of divisors   def   divisorsSum  (  n  )   :   sum   =   0   # Initialize sum of prime factors   # Note that this loop runs till square   # root of n   i   =   1   while   i   <=   math  .  sqrt  (  n  )   :   if   (  n   %   i   ==   0  )   :   # If divisors are equal take only one   # of them   if   (  n   //   i   ==   i  )   :   sum   =   sum   +   i   else   :   # Otherwise take both   sum   =   sum   +   i  ;   sum   =   sum   +   (  n   //   i  )   i   =   i   +   1   return   sum   # Function to check Deficient Number   def   isDeficient  (  n  )   :   # Check if sum(n)  < 2 * n   return   (  divisorsSum  (  n  )    <   (  2   *   n  ))   # Driver program to test above function    if   (   isDeficient  (  12  )   ):   print   (  'YES'  )   else   :   print   (  'NO'  )   if   (   isDeficient  (  15  )   )   :   print   (  'YES'  )   else   :   print   (  'NO'  )   # This Code is contributed by Nikita Tiwari   
C#
   // C# program to implement an Optimized Solution   // to check Deficient Number   using     System  ;   class     GFG     {      // Function to calculate sum of      // divisors      static     int     divisorsSum  (  int     n  )      {      // Initialize sum of prime factors      int     sum     =     0  ;      // Note that this loop runs till      // square root of n      for     (  int     i     =     1  ;     i      <=     (  Math  .  Sqrt  (  n  ));     i  ++  )     {      if     (  n     %     i     ==     0  )     {      // If divisors are equal      // take only one of them      if     (  n     /     i     ==     i  )     {      sum     =     sum     +     i  ;      }      else     // Otherwise take both      {      sum     =     sum     +     i  ;      sum     =     sum     +     (  n     /     i  );      }      }      }      return     sum  ;      }      // Function to check Deficient Number      static     bool     isDeficient  (  int     n  )      {      // Check if sum(n)  < 2 * n      return     (  divisorsSum  (  n  )      <     (  2     *     n  ));      }      /* Driver program to test above function */      public     static     void     Main  ()      {      string     var     =     isDeficient  (  12  )     ?     'YES'     :     'NO'  ;      Console  .  WriteLine  (  var  );      string     var1     =     isDeficient  (  15  )     ?     'YES'     :     'NO'  ;      Console  .  WriteLine  (  var1  );      }   }   // This code is contributed by vt_m   
PHP
      // PHP program to implement    // an Optimized Solution   // to check Deficient Number   // Function to calculate   // sum of divisors   function   divisorsSum  (  $n  )   {   // Initialize sum of   // prime factors   $sum   =   0  ;   // Note that this loop runs    // till square root of n   for   (  $i   =   1  ;   $i    <=   sqrt  (  $n  );   $i  ++  )   {   if   (  $n   %   $i  ==  0  )   {   // If divisors are equal    // take only one of them   if   (  $n   /   $i   ==   $i  )   {   $sum   =   $sum   +   $i  ;   }   // Otherwise take both   else   {   $sum   =   $sum   +   $i  ;   $sum   =   $sum   +   (  $n   /   $i  );   }   }   }   return   $sum  ;   }   // Function to check   // Deficient Number   function   isDeficient  (  $n  )   {   // Check if sum(n)  < 2 * n   return   (  divisorsSum  (  $n  )    <   (  2   *   $n  ));   }   // Driver Code   $ds   =   isDeficient  (  12  )   ?   'YES  n  '   :   'NO  n  '  ;   echo  (  $ds  );   $ds   =   isDeficient  (  15  )   ?   'YES  n  '   :   'NO  n  '  ;   echo  (  $ds  );   // This code is contributed by ajit;.   ?>   
JavaScript
    <  script  >   // Javascript program to check Deficient Number      // Function to calculate sum of divisors      function     divisorsSum  (  n  )      {      let     sum     =     0  ;     // Initialize sum of prime factors          // Note that this loop runs till square root of n      for     (  let     i     =     1  ;     i      <=     (  Math  .  sqrt  (  n  ));     i  ++  )      {      if     (  n     %     i     ==     0  )         {          // If divisors are equal take only one      // of them      if     (  n     /     i     ==     i  )     {      sum     =     sum     +     i  ;      }      else     // Otherwise take both      {      sum     =     sum     +     i  ;      sum     =     sum     +     (  n     /     i  );      }      }      }          return     sum  ;      }          // Function to check Deficient Number      function     isDeficient  (  n  )      {          // Check if sum(n)  < 2 * n      return     (  divisorsSum  (  n  )      <     (  2     *     n  ));      }   // Driver code to test above methods      if     (  isDeficient  (  12  ))      document  .  write  (  'YES'     +     '  
'
); else document . write ( 'NO' + '
'
); if ( isDeficient ( 15 )) document . write ( 'YES' + '
'
); else document . write ( 'NO' + '
'
); // This code is contributed by avijitmondal1998. < /script>

Изход:  
 

NO YES 


Времева сложност: O(sqrt(n)) 
Помощно пространство: О(1)
препратки: 
https://en.wikipedia.org/wiki/Deficient_number