不足している数
#practiceLinkDiv { 表示: なし !重要; } 数 n は、次の式で示される数のすべての約数の合計である場合、不足数であると言われます。 約数Sum(n) は数値 n の値の 2 倍未満です。これら 2 つの値の差は、 欠乏 。
数学的には、以下の条件が当てはまる場合、数値が不足していると言われます。
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) の場合のように 2 つの等しい約数がある場合に注意する必要があります。このような場合、合計の計算にはそのうちの 1 つだけが使用されます。
最適化されたアプローチの導入
// 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