求自然数|集2的所有除数

给定一个自然数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
喜欢就支持一下吧
点赞10 分享