Find length of period in decimal value of 1/n
Last Updated :
14 Dec, 2022
Given a positive integer n, find the period in decimal value of 1/n. Period in decimal value is number of digits (somewhere after decimal point) that keep repeating.
Examples :
Input: n = 3
Output: 1
The value of 1/3 is 0.333333...
Input: n = 7
Output: 6
The value of 1/7 is 0.142857142857142857.....
Input: n = 210
Output: 6
The value of 1/210 is 0.0047619047619048.....
Let us first discuss a simpler problem of finding individual digits in value of 1/n.
How to find individual digits in value of 1/n?
Let us take an example to understand the process. For example for n = 7. The first digit can be obtained by doing 10/7. Second digit can be obtained by 30/7 (3 is remainder in previous division). Third digit can be obtained by 20/7 (2 is remainder of previous division). So the idea is to get the first digit, then keep taking value of (remainder * 10)/n as next digit and keep updating remainder as (remainder * 10) % 10. The complete program is discussed here.
How to find the period?
The period of 1/n is equal to the period in sequence of remainders used in the above process. This can be easily proved from the fact that digits are directly derived from remainders.
One interesting fact about sequence of remainders is, all terns in period of this remainder sequence are distinct. The reason for this is simple, if a remainder repeats, then it’s beginning of new period.
Following is the implementation of above idea.
CPP
#include <iostream>
#include <map>
using namespace std;
int getPeriod( int n)
{
map< int , int > mymap;
map< int , int >::iterator it;
int rem = 1, i = 1;
while ( true )
{
rem = (10*rem) % n;
it = mymap.find(rem);
if (it != mymap.end())
return (i - it->second);
mymap[rem] = i;
i++;
}
return INT_MAX;
}
int main()
{
cout << getPeriod(3) << endl;
cout << getPeriod(7) << endl;
return 0;
}
|
Java
import java.util.*;
class GFG {
static int getPeriod( int n)
{
HashMap<Integer, Integer> mymap
= new HashMap<Integer, Integer>();
int rem = 1 , i = 1 ;
while ( true ) {
rem = ( 10 * rem) % n;
if (mymap.containsKey(rem)) {
int it = mymap.get(rem);
return i - it;
}
mymap.put(rem, i);
i++;
}
}
public static void main(String[] args)
{
System.out.println(getPeriod( 3 ));
System.out.println(getPeriod( 7 ));
}
}
|
Python3
import sys
def getPeriod(n):
mymap = dict ()
rem = 1
i = 1
pos = 0
while True :
rem = ( 10 * rem) % n
if (rem in mymap):
return (i - mymap[rem])
mymap[rem] = i
i + = 1
return sys.maxint
print (getPeriod( 3 ))
print (getPeriod( 7 ))
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static int getPeriod( int n)
{
Dictionary< int , int > mymap
= new Dictionary< int , int >();
int rem = 1, i = 1;
while ( true ) {
rem = (10 * rem) % n;
if (mymap.ContainsKey(rem)) {
var it = mymap[rem];
return i - it;
}
mymap[rem] = i;
i++;
}
}
public static void Main( string [] args)
{
Console.WriteLine(getPeriod(3));
Console.WriteLine(getPeriod(7));
}
}
|
Javascript
function getPeriod(n)
{
let mymap = {};
let rem = 1, i = 1;
let pos = 0;
while ( true )
{
rem = (10 * rem) % n;
if (mymap.hasOwnProperty(rem))
return (i - mymap[rem]);
mymap[rem] = i;
i++;
}
return Number.MAX_SAFE_INTEGER;
}
console.log(getPeriod(3));
console.log(getPeriod(7));
|
Output:
1
6
We can avoid the use of map or hash using the following fact. For a number n, there can be at most n distinct remainders. Also, the period may not begin from the first remainder as some initial remainders may be non-repetitive (not part of any period). So to make sure that a remainder from a period is picked, start from the (n+1)th remainder and keep looking for its next occurrence. The distance between (n+1)’th remainder and its next occurrence is the length of the period.
C++
#include <iostream>
using namespace std;
int getPeriod( int n)
{
int rem = 1;
for ( int i = 1; i <= n+1; i++)
rem = (10*rem) % n;
int d = rem;
int count = 0;
do {
rem = (10*rem) % n;
count++;
} while (rem != d);
return count;
}
int main()
{
cout << getPeriod(3) << endl;
cout << getPeriod(7) << endl;
return 0;
}
|
Java
class GFG {
static int getPeriod( int n)
{
int rem = 1 ;
for ( int i = 1 ; i <= n + 1 ; i++)
rem = ( 10 * rem) % n;
int d = rem;
int count = 0 ;
do {
rem = ( 10 * rem) % n;
count++;
} while (rem != d);
return count;
}
public static void main(String[] args)
{
System.out.println(getPeriod( 3 ) );
System.out.println(getPeriod( 7 ));
}
}
|
Python3
def getPeriod( n) :
rem = 1
for i in range ( 1 , n + 2 ):
rem = ( 10 * rem) % n
d = rem
count = 0
rem = ( 10 * rem) % n
count + = 1
while rem ! = d :
rem = ( 10 * rem) % n
count + = 1
return count
if __name__ = = "__main__" :
print (getPeriod( 3 ))
print (getPeriod( 7 ))
|
C#
using System;
class GFG {
static int getPeriod( int n)
{
int rem = 1;
for ( int i = 1; i <= n + 1; i++)
rem = (10 * rem) % n;
int d = rem;
int count = 0;
do {
rem = (10 * rem) % n;
count++;
} while (rem != d);
return count;
}
public static void Main()
{
Console.Write(getPeriod(3) + "\n" );
Console.Write(getPeriod(7));
}
}
|
PHP
<?php
function getPeriod( $n )
{
$rem = 1;
for ( $i = 1; $i <= $n + 1; $i ++)
$rem = (10 * $rem ) % $n ;
$d = $rem ;
$count = 0;
do
{
$rem = (10 * $rem ) % $n ;
$count ++;
} while ( $rem != $d );
return $count ;
}
echo getPeriod(3), "\n" ;
echo getPeriod(7), "\n" ;
?>
|
Javascript
<script>
function getPeriod(n)
{
let rem = 1;
for (let i = 1; i <= n + 1; i++)
rem = (10 * rem) % n;
let d = rem;
let count = 0;
do {
rem = (10 * rem) % n;
count++;
} while (rem != d);
return count;
}
document.write(getPeriod(3)+ "<br>" )
document.write(getPeriod(7)+ "<br>" )
</script>
|
Output:
1
6
Reference:
Algorithms And Programming: Problems And Solutions by Alexander Shen
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...