#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 << 'YESn' : cout << 'NOn'; isDeficient(15) ? cout << 'YESn' : cout << 'NOn'; 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) ? 'YESn' : 'NOn'; echo($ds); $ds = isDeficient(15) ? 'YESn' : 'NOn'; 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