Nth character in Concatenated Decimal String

If all decimal numbers are concatenated in a string then we will get a string which looks like string P as shown below. We need to tell Nth character of this string.
P = “12345678910111213141516171819202122232425262728293031….”
Examples:

N = 10    10th character is 1
N = 11    11th character is 0
N = 50    50th character is 3
N = 190    190th character is 1

We can solve this problem by break-ing the string length-wise. We know that in decimal 9 numbers are of length 1, 90 numbers are of length 2, 900 numbers are of length 3 and so on, so we can skip these numbers according to the given N and can get the desired character.

Processing for N = 190 is explained below,
P[184..195] = “979899100101” 
First getting length of number at N,
190 – 9 = 181        number length is more than 1
181 – 90*2 = 1       number length is more than 2
1 – 900*3 < 0        number length is 3
Now getting actual character at N,
1 character after maximum 2 length number(99) is,  1

Processing for N = 251 is explained below,
P[250..255] = “120121”
First getting length of number at N,
251 - 9 = 242             number length is more than 1
242 – 90*2 = 62           number length is more than 2
62 – 900*3 < 0            number length is 3
Now getting actual character at N,
62 characters after maximum 2 length number(99) is,
Ceil(62/3) = 21,  99 + 21 = 120 
120 is the number at N, now getting actual digit,
62%3 = 2,
2nd digit of 120 is 2, so our answer will be 2 only.

Please see below code for better understanding,

C/C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program to get Nth character in
// concatenated Decimal String
#include <bits/stdc++.h>
using namespace std;
  
//  Utility method to get dth digit of number N
char getDigit(int N, int d)
{
    string str;
    stringstream ss;
    ss << N;
    ss >> str;
    return str[d - 1];
}
  
// Method to return Nth character in concatenated
// decimal string
char getNthChar(int N)
{
    //  sum will store character escaped till now
    int sum = 0, nine = 9;
  
    //  dist will store numbers escaped till now
    int dist = 0, len;
  
    //  loop for number lengths
    for (len = 1; ; len++)
    {
        // nine*len will be incremented characters
        // and nine will be incremented numbers
        sum += nine*len;
        dist += nine;
  
        if (sum >= N)
        {
            //  restore variables to previous correct state
            sum -= nine*len;
            dist -= nine;
            N -= sum;
            break;
        }
        nine *= 10;
    }
  
    // get distance from last one digit less maximum
    // number
    int diff = ceil((double)N / len);
  
    // d will store dth digit of current number
    int d = N % len;
    if (d == 0)
        d = len;
  
    // method will return dth numbered digit
    // of (dist + diff) number
    return getDigit(dist + diff, d);
}
  
//  Driver code to test above methods
int main()
{
    int N = 251;
    cout << getNthChar(N) << endl;
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java program to get Nth character in 
// concatenated Decimal String 
  
class GFG
{
      
// Utility method to get dth digit of number N 
static char getDigit(int N, int d) 
    String str=Integer.toString(N);
    return str.charAt(d - 1); 
  
// Method to return Nth character in concatenated 
// decimal string 
static char getNthChar(int N) 
    // sum will store character escaped till now 
    int sum = 0, nine = 9
  
    // dist will store numbers escaped till now 
    int dist = 0, len; 
  
    // loop for number lengths 
    for (len = 1; ; len++) 
    
        // nine*len will be incremented characters 
        // and nine will be incremented numbers 
        sum += nine * len; 
        dist += nine; 
  
        if (sum >= N) 
        
            // restore variables to previous correct state 
            sum -= nine * len; 
            dist -= nine; 
            N -= sum; 
            break
        
        nine *= 10
    
  
    // get distance from last one digit 
    // less maximum number 
    int diff = (int)(Math.ceil((double)(N) / (double)(len))); 
  
    // d will store dth digit of current number 
    int d = N % len; 
    if (d == 0
        d = len; 
  
    // method will return dth numbered digit 
    // of (dist + diff) number 
    return getDigit(dist + diff, d); 
  
// Driver code
public static void main (String[] args)
{
    int N = 251
    System.out.println(getNthChar(N)); 
}
  
// This code is contributed by mits

chevron_right


Python

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python program to get Nth character in
# concatenated Decimal String
   
# Method to get dth digit of number N
def getDigit(N, d):
    string = str(N)
    return string[d-1];
   
# Method to return Nth character in concatenated
# decimal string
def getNthChar(N):
  
    #  sum will store character escaped till now
    sum = 0
    nine = 9
   
    #  dist will store numbers escaped till now
    dist = 0
   
    #  loop for number lengths
    for len in range(1,N):
      
        # nine*len will be incremented characters
        # and nine will be incremented numbers
        sum += nine*len
        dist += nine
        if (sum >= N):
          
            #  restore variables to previous correct state
            sum -= nine*len
            dist -= nine
            N -= sum
            break
              
        nine *= 10
   
    # get distance from last one digit less maximum
    # number
    diff = (N / len) + 1
   
    # d will store dth digit of current number
    d = N % len
    if (d == 0):
        d = len
   
    # method will return dth numbered digit
    # of (dist + diff) number
    return getDigit(dist + diff, d);
   
#  Driver code to test above methods
N = 251
print getNthChar(N)
  
# Contributed by Afzal_Saan

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# program to get Nth character in 
// concatenated Decimal String 
using System;
  
class GFG
{
      
// Utility method to get dth digit of number N 
static char getDigit(int N, int d) 
    string str = Convert.ToString(N);
    return str[d - 1]; 
  
// Method to return Nth character in 
// concatenated decimal string 
static char getNthChar(int N) 
    // sum will store character
    // escaped till now 
    int sum = 0, nine = 9; 
  
    // dist will store numbers 
    // escaped till now 
    int dist = 0, len; 
  
    // loop for number lengths 
    for (len = 1; ; len++) 
    
        // nine*len will be incremented characters 
        // and nine will be incremented numbers 
        sum += nine * len; 
        dist += nine; 
  
        if (sum >= N) 
        
            // restore variables to previous 
            // correct state 
            sum -= nine * len; 
            dist -= nine; 
            N -= sum; 
            break
        
        nine *= 10; 
    
  
    // get distance from last one digit 
    // less maximum number 
    int diff = (int)(Math.Ceiling((double)(N) /
                                  (double)(len))); 
  
    // d will store dth digit of 
    // current number 
    int d = N % len; 
    if (d == 0) 
        d = len; 
  
    // method will return dth numbered 
    // digit of (dist + diff) number 
    return getDigit(dist + diff, d); 
  
// Driver code
static void Main() 
{
    int N = 251; 
    Console.WriteLine(getNthChar(N)); 
}
  
// This code is contributed by mits

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP program to get Nth character 
// in concatenated Decimal String
  
// Method to get dth digit 
// of number N
function getDigit($N, $d)
{
    $string = strval($N);
    return $string[$d - 1];
}
  
// Method to return Nth character 
// in concatenated decimal string
function getNthChar($N)
{
    // sum will store character 
    // escaped till now
    $sum = 0;
    $nine = 9;
  
    // dist will store numbers 
    // escaped till now
    $dist = 0;
  
    // loop for number lengths
    for($len = 1; $len < $N; $len++)
    {
      
        // nine*len will be incremented characters
        // and nine will be incremented numbers
        $sum += $nine * $len;
        $dist += $nine;
        if ($sum >= $N)
        {
            // restore variables to
            // previous correct state
            $sum -= $nine * $len;
            $dist -= $nine;
            $N -= $sum;
            break;
        
        $nine *= 10;
    }
      
    // get distance from last one 
    // digit less maximum number
    $diff = ($N / $len) + 1;
  
    // d will store dth digit 
    // of current number
    $d = $N % $len;
    if ($d == 0)
        $d = $len;
  
    // method will return dth numbered 
    // digit of (dist + diff) number
    return getDigit($dist + $diff, $d);
}
  
// Driver code
$N = 251;
echo getNthChar($N);
  
// This code is contributed by mits
?>

chevron_right



Output:

2

This article is contributed by Utkarsh Trivedi. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.



My Personal Notes arrow_drop_up

Improved By : Mithun Kumar



Article Tags :
Practice Tags :


2


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.