Given a number n, find the first k digits of n^n
Last Updated :
23 Jun, 2022
Given a number n, find the first k digits of nn, where k is a value less than the number of digits in nn
Examples :
Input : n = 10
k = 2
Output : 10
The first 2 digits in 1010 are 10.
Input : n = 144
k = 6
Output : 637087
Input: n = 1250
k = 5
Output: 13725
The problem can be solved in multiple ways, of which two are:
Method 1 (Simple): A naive method which involves calculating the actual value and then dividing by 10 until we get the required answer. However this method cannot take input greater than n = 15 as it would cause overflow.
C++
#include <bits/stdc++.h>
using namespace std;
unsigned long long firstkdigits( int n, int k)
{
unsigned long long product = 1;
for ( int i = 0 ; i < n ; i++)
product *= n;
while (( int )(product / pow (10, k)) != 0)
product = product / 10;
return product;
}
int main()
{
int n = 15;
int k = 4;
cout << firstkdigits(n, k);
return 0;
}
|
Java
public class Digits
{
static long firstkdigits( int n, int k)
{
long product = 1 ;
for ( int i = 0 ; i < n ; i++)
product *= n;
while (( int )(product / Math.pow( 10 , k)) != 0 )
product = product / 10 ;
return product;
}
public static void main(String[] args)
{
int n = 15 ;
int k = 4 ;
System.out.println(firstkdigits(n, k));
}
}
|
Python 3
def firstkdigits(n, k):
product = 1
for i in range (n ):
product * = n
while ((product / / pow ( 10 , k)) ! = 0 ):
product = product / / 10
return product
n = 15
k = 4
print (firstkdigits(n, k))
|
C#
using System;
class Digits
{
static long firstkdigits( int n, int k)
{
long product = 1;
for ( int i = 0 ; i < n ; i++)
product *= n;
while (( int )(product / Math.Pow(10, k)) != 0)
product = product / 10;
return product;
}
public static void Main()
{
int n = 15;
int k = 4;
Console.Write(firstkdigits(n, k));
}
}
|
PHP
<?php
function firstkdigits( $n , $k )
{
$product = 1;
for ( $i = 0 ; $i < $n ; $i ++)
$product *= $n ;
while ((int)( $product / pow(10, $k )) != 0)
$product = (int) $product / 10;
return floor ( $product );
}
$n = 15;
$k = 4;
echo firstkdigits( $n , $k );
?>
|
Javascript
<script>
function firstkdigits(n,k)
{
let product = 1;
for (let i = 0 ; i < n ; i++)
product *= n;
while (Math.floor(product / Math.pow(10, k)) != 0)
product = Math.floor(product / 10);
return product;
}
let n = 15;
let k = 4;
document.write(firstkdigits(n, k));
</script>
|
Output :
4378
Method 2: The next method involves using logarithms to calculate the first k digits. The method and steps are explained below:
- Let product = nn. Take logarithm base 10 on both sides of the equation. We get log10(product) = log10(nn), which we can also write as n*log10(n)
- In this example, we get log10(product) = 3871.137516. We can split the RHS as 3871 + 0.137516, so our equation can now be written as log10(product) = 3871 + 0.137516
- Raise both sides with base 10, and using the above example, we get product = 103871 x 100.137516. 103871 will not make a difference to our first k digits as it only shifts decimal points. We are interested in the next part, 100.137516, as this will determine the first few digits.
In this case, the value of 100.137516 is 1.37251.
- Hence our required first 5 digits would be 13725.
C++
#include <bits/stdc++.h>
using namespace std;
long long firstkdigits( int n, int k)
{
long double product = n * log10 (n);
long double decimal_part = product - floor (product);
decimal_part = pow (10, decimal_part);
long long digits = pow (10, k - 1), i = 0;
return decimal_part * digits;
}
int main()
{
int n = 1450;
int k = 6;
cout << firstkdigits(n, k);
return 0;
}
|
Java
import java.util.*;
import java.lang.*;
import java.io.*;
class KDigitSquare
{
public static long firstkdigits( int n, int k)
{
double product = n * Math.log10(n);
double decimal_part = product - Math.floor(product);
decimal_part = Math.pow( 10 , decimal_part);
double digits = Math.pow( 10 , k - 1 ), i = 0 ;
return (( long )(decimal_part * digits));
}
public static void main (String[] args)
{
int n = 1450 ;
int k = 6 ;
System.out.println(firstkdigits(n,k));
}
}
|
Python3
import math
def firstkdigits(n, k):
product = n * math.log(n, 10 );
decimal_part = product - math.floor(product);
decimal_part = pow ( 10 , decimal_part);
digits = pow ( 10 , k - 1 );
return math.floor(decimal_part * digits);
n = 1450 ;
k = 6 ;
print (firstkdigits(n, k));
|
C#
using System;
class GFG {
public static long firstkdigits( int n, int k)
{
double product = n * Math.Log10(n);
double decimal_part = product -
Math.Floor(product);
decimal_part = Math.Pow(10, decimal_part);
double digits = Math.Pow(10, k - 1);
return (( long )(decimal_part * digits));
}
public static void Main ()
{
int n = 1450;
int k = 6;
Console.Write(firstkdigits(n,k));
}
}
|
PHP
<?php
function firstkdigits( $n , $k )
{
$product = $n * log10( $n );
$decimal_part = $product -
floor ( $product );
$decimal_part = pow(10, $decimal_part );
$digits = pow(10, $k - 1);
$i = 0;
return floor ( $decimal_part * $digits );
}
$n = 1450;
$k = 6;
echo firstkdigits( $n , $k );
?>
|
Javascript
<script>
function firstkdigits(n,k)
{
let product = n * Math.log10(n);
let decimal_part = product - Math.floor(product);
decimal_part = Math.pow(10, decimal_part);
let digits = Math.pow(10, k - 1), i = 0;
return (Math.floor(decimal_part * digits));
}
let n = 1450;
let k = 6;
document.write(firstkdigits(n, k));
</script>
|
Output :
962948
This code runs in constant time and can handle large input values of n
Share your thoughts in the comments
Please Login to comment...