给定一个自然数n,打印它的所有不同除数。
null
例如:
Input : n = 10 Output: 1 2 5 10 Input: n = 100 Output: 1 2 4 5 10 20 25 50 100 Input: n = 125 Output: 1 5 25 125
我们强烈建议参考以下文章作为先决条件。 求自然数|集1的所有除数 在上面的帖子中,我们找到了一种方法来找到O(sqrt(n))中的所有除数。 但是解决方案中还有一个小问题,你能猜到吗? 对输出不是我们使用蛮力技术得到的排序方式。
如何按排序顺序打印输出? 如果我们观察我们得到的输出,我们可以分析除数是以之字形的方式打印的(小的,大的对)。因此,如果我们存储其中的一半,那么我们就可以按顺序打印它们。
以下是相同的实现:
C++
// A O(sqrt(n)) program that prints all divisors // in sorted order #include <bits/stdc++.h> using namespace std; // function to print the divisors void printDivisors( int n) { // Vector to store half of the divisors vector< int > v; for ( int i = 1; i <= sqrt (n); i++) { if (n % i == 0) { // check if divisors are equal if (n / i == i) printf ( "%d " , i); else { printf ( "%d " , i); // push the second divisor in the vector v.push_back(n / i); } } } // The vector will be printed in reverse for ( int i = v.size() - 1; i >= 0; i--) printf ( "%d " , v[i]); } /* Driver program to test above function */ int main() { printf ( "The divisors of 100 are: " ); printDivisors(100); return 0; } |
JAVA
// A O(sqrt(n)) java program that prints all divisors // in sorted order import java.util.Vector; class Test { // method to print the divisors static void printDivisors( int n) { // Vector to store half of the divisors Vector<Integer> v = new Vector<>(); for ( int i = 1 ; i <= Math.sqrt(n); i++) { if (n % i == 0 ) { // check if divisors are equal if (n / i == i) System.out.printf( "%d " , i); else { System.out.printf( "%d " , i); // push the second divisor in the vector v.add(n / i); } } } // The vector will be printed in reverse for ( int i = v.size() - 1 ; i >= 0 ; i--) System.out.printf( "%d " , v.get(i)); } // Driver method public static void main(String args[]) { System.out.println( "The divisors of 100 are: " ); printDivisors( 100 ); } } |
Python3
# A O(sqrt(n)) java program that prints # all divisors in sorted order import math # Method to print the divisors def printDivisors(n) : list = [] # List to store half of the divisors for i in range ( 1 , int (math.sqrt(n) + 1 )) : if (n % i = = 0 ) : # Check if divisors are equal if (n / i = = i) : print (i, end = " " ) else : # Otherwise print both print (i, end = " " ) list .append( int (n / i)) # The list will be printed in reverse for i in list [:: - 1 ] : print (i, end = " " ) # Driver method print ( "The divisors of 100 are: " ) printDivisors( 100 ) # This code is contributed by Gitanjali |
C#
// A O(sqrt(n)) C# program that // prints all divisors in sorted order using System; class GFG { // method to print the divisors static void printDivisors( int n) { // Vector to store half // of the divisors int [] v = new int [n]; int t = 0; for ( int i = 1; i <= Math.Sqrt(n); i++) { if (n % i == 0) { // check if divisors are equal if (n / i == i) Console.Write(i + " " ); else { Console.Write(i + " " ); // push the second divisor // in the vector v[t++] = n / i; } } } // The vector will be // printed in reverse for ( int i = t - 1; i >= 0; i--) Console.Write(v[i] + " " ); } // Driver Code public static void Main() { Console.Write( "The divisors of 100 are: " ); printDivisors(100); } } // This code is contributed // by ChitraNayal |
PHP
<?php // A O(sqrt(n)) program that // prints all divisors in // sorted order // function to print // the divisors function printDivisors( $n ) { // Vector to store half // of the divisors $v ; $t = 0; for ( $i = 1; $i <= (int)sqrt( $n ); $i ++) { if ( $n % $i == 0) { // check if divisors are equal if ((int) $n / $i == $i ) echo $i . " " ; else { echo $i . " " ; // push the second // divisor in the vector $v [ $t ++] = (int) $n / $i ; } } } // The vector will be // printed in reverse for ( $i = count ( $v ) - 1; $i >= 0; $i --) echo $v [ $i ] . " " ; } // Driver code echo "The divisors of 100 are: " ; printDivisors(100); // This code is contributed by mits ?> |
Javascript
<script> // A O(sqrt(n)) program that // prints all divisors in // sorted order // function to print // the divisors function printDivisors(n) { // Vector to store half // of the divisors let v = []; let t = 0; for (let i = 1; i <= parseInt(Math.sqrt(n)); i++) { if (n % i == 0) { // check if divisors are equal if (parseInt(n / i) == i) document.write(i + " " ); else { document.write(i + " " ); // push the second // divisor in the vector v[t++] = parseInt(n / i); } } } // The vector will be // printed in reverse for (let i = v.length - 1; i >= 0; i--){ document.write(v[i] + " " ); } } // Driver code document.write( "The divisors of 100 are: " ); printDivisors(100); // This code is contributed by _saurabh_jaiswal </script> |
输出
The divisors of 100 are: n1 2 4 5 10 20 25 50 100
时间复杂性: O(sqrt(n)) 辅助空间: O(sqrt(n))
O(sqrt(n))时间和O(1)空间解:
C++
// A O(sqrt(n)) program that prints all divisors // in sorted order #include <iostream> #include <math.h> using namespace std; // Function to print the divisors void printDivisors( int n) { int i; for (i = 1; i * i < n; i++) { if (n % i == 0) cout<<i<< " " ; } if (i - (n / i) == 1) { i--; } for (; i >= 1; i--) { if (n % i == 0) cout<<n / i<< " " ; } } // Driver code int main() { cout << "The divisors of 100 are: " ; printDivisors(100); return 0; } // This code is contributed by siteshbiswal |
C
// A O(sqrt(n)) program that prints all divisors // in sorted order #include <stdio.h> #include <math.h> // function to print the divisors void printDivisors( int n) { int i; for ( i = 1; i*i < n; i++) { if (n % i == 0) printf ( "%d " , i); } if (i-(n/i)==1) { i--; } for (; i >= 1; i--) { if (n % i == 0) printf ( "%d " , n / i); } } /* Driver program to test above function */ int main() { printf ( "The divisors of 100 are: " ); printDivisors(100); return 0; } |
JAVA
// A O(sqrt(n)) program that prints all // divisors in sorted order import java.lang.Math; class GFG{ // Function to print the divisors public static void printDivisors( int n) { int i; for ( i = 1 ; i * i < n; i++) { if (n % i == 0 ) System.out.print(i + " " ); } if (i-(n/i)== 1 ) { i--; } for (; i >= 1 ; i--) { if (n % i == 0 ) System.out.print(n / i + " " ); } } // Driver code public static void main(String[] args) { System.out.println( "The divisors of 100 are: " ); printDivisors( 100 ); } } // This code is contributed by Prakash Veer Singh Tomar. |
Python3
# A O(sqrt(n)) program that prints all divisors # in sorted order from math import * # Function to print the divisors def printDivisors (n): i = 1 while (i * i < n): if (n % i = = 0 ): print (i, end = " " ) i + = 1 for i in range ( int (sqrt(n)), 0 , - 1 ): if (n % i = = 0 ): print (n / / i, end = " " ) # Driver Code print ( "The divisors of 100 are: " ) printDivisors( 100 ) # This code is contributed by himanshu77 |
C#
// A O(sqrt(n)) program that prints // all divisors in sorted order using System; using System.Collections; using System.Collections.Generic; class GFG{ // Function to print the divisors static void printDivisors( int n) { for ( int i = 1; i * i < n; i++) { if (n % i == 0) Console.Write(i + " " ); } for ( int i = ( int )Math.Sqrt(n); i >= 1; i--) { if (n % i == 0) Console.Write(n / i + " " ); } } // Driver code public static void Main( string []arg) { Console.Write( "The divisors of 100 are: " ); printDivisors(100); } } // This code is contributed by rutvik_56 |
Javascript
<script> // A O(sqrt(n)) program that prints all divisors // in sorted order // function to print the divisors function printDivisors(n) { for ( var i = 1; i*i < n; i++) { if (n % i == 0) document.write(i + " " ); } for ( var i = Math.sqrt(n); i >= 1; i--) { if (n % i == 0) document.write( " " + n / i); } } // Driver program to test above function document.write( "The divisors of 100 are: " ); printDivisors(100); // This code is contributed by simranarora5sos </script> |
输出
The divisors of 100 are: 1 2 4 5 10 20 25 50 100
感谢神秘之心提出上述解决方案。
当循环条件中的角因子之差为1时,使用两个循环之间的if条件(例如,这里的因子为30(5,6),5将被打印两次;要解决该问题,需要执行此步骤。
本文由 阿什图什·库马尔 。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请发表评论。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END