Recursive sum of digit in n^x, where n and x are very large
Given very large numbers n and x, we need to find the sum of digits of n^x such that :
If n^x < 10
digSum(n^x) = n^x
Else
digSum(n^x) = Sum(digSum(n^x))
Examples:
Input : 5 4
Output : 4
We know 54 = 625
Sum of digits in 625 = 6 + 2 + 5 = 13
Sum of digits in 13 = 1 + 3 = 4
Input : 546878 56422
Output : 7
Prerequisite : Recursive sum of digits.
The idea is:
Sum of digits repeats after every 6th exponents.
Let SoD(n) = a
Let b = x % 6
then
SoD(n^x) = SoD(a^b) except for b = 1 when a = 3 & 6
SoD(n^x) = 9 forall x > 1, when a = 3 & 6
C++
#include <bits/stdc++.h>
using namespace std;
long digSum( long n)
{
if (n == 0)
return 0;
return (n % 9 == 0)
? 9 : (n % 9);
}
long PowDigSum( long n, long x)
{
long sum = digSum(n);
long rem = x % 6;
if ((sum == 3 || sum == 6)
&& x > 1)
return 9;
else if (x == 1)
return sum;
else if (x == 0)
return 1;
else if (rem == 0)
return digSum(( long ) pow (sum, 6));
else
return digSum(( long ) pow (sum, rem));
}
int main()
{
int n = 33333;
int x = 332654;
cout << PowDigSum(n, x);
return 0;
}
|
Java
import java.util.*;
class GFG {
static long digSum( long n)
{
if (n == 0 )
return 0 ;
return (n % 9 == 0 ) ? 9 : (n % 9 );
}
static long PowDigSum( long n, long x)
{
long sum = digSum(n);
long rem = x % 6 ;
if ((sum == 3 || sum == 6 ) && x > 1 )
return 9 ;
else if (x == 1 )
return sum;
else if (x == 0 )
return 1 ;
else if (rem == 0 )
return digSum(( long )Math.pow(sum, 6 ));
else
return digSum(( long )Math.pow(sum, rem));
}
public static void main(String[] args)
{
int n = 33333 ;
int x = 332654 ;
System.out.println(PowDigSum(n, x));
}
}
|
Python3
import math
def digSum(n):
if (n = = 0 ):
return 0
if n % 9 = = 0 :
return 9
else :
return (n % 9 )
def PowDigSum(n, x):
sum = digSum(n)
rem = x % 6
if (( sum = = 3 or sum = = 6 ) and x > 1 ):
return 9
elif (x = = 1 ):
return sum
elif (x = = 0 ):
return 1
elif (rem = = 0 ):
return digSum(math. pow ( sum , 6 ))
else :
return digSum(math. pow ( sum , rem))
n = 33333
x = 332654
print (PowDigSum(n, x))
|
C#
using System;
class GFG {
static long digSum( long n)
{
if (n == 0)
return 0;
return (n % 9 == 0) ? 9 : (n % 9);
}
static long PowDigSum( long n, long x)
{
long sum = digSum(n);
long rem = x % 6;
if ((sum == 3 || sum == 6) && x > 1)
return 9;
else if (x == 1)
return sum;
else if (x == 0)
return 1;
else if (rem == 0)
return digSum(( long )Math.Pow(sum, 6));
else
return digSum(( long )Math.Pow(sum, rem));
}
public static void Main()
{
int n = 33333;
int x = 332654;
Console.WriteLine(PowDigSum(n, x));
}
}
|
PHP
<?php
function digSum( $n )
{
if ( $n == 0)
return 0;
return ( $n % 9 == 0)
? 9 : ( $n % 9);
}
function PowDigSum( $n , $x )
{
$sum = digSum( $n );
$rem = $x % 6;
if (( $sum == 3 || $sum == 6)
&& $x > 1)
return 9;
else if ( $x == 1)
return $sum ;
else if ( $x == 0)
return 1;
else if ( $rem == 0)
return digSum(pow( $sum , 6));
else
return digSum(pow( $sum , $rem ));
}
$n = 33333;
$x = 332654;
echo PowDigSum( $n , $x );
?>
|
Javascript
<script>
function digSum(n)
{
if (n == 0)
return 0;
return (n % 9 == 0)
? 9 : (n % 9);
}
function PowDigSum(n, x)
{
let sum = digSum(n);
let rem = x % 6;
if ((sum == 3 || sum == 6)
&& x > 1)
return 9;
else if (x == 1)
return sum;
else if (x == 0)
return 1;
else if (rem == 0)
return digSum(Math.pow(sum, 6));
else
return digSum(Math.pow(sum, rem));
}
let n = 33333;
let x = 332654;
document.write(PowDigSum(n, x));
</script>
|
Output:
9
Last Updated :
08 Apr, 2021
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...