Open In App

Print all numbers up to N in words in lexicographical order

Improve
Improve
Like Article
Like
Save
Share
Report

Given an integer N, the task is to print all numbers from 1 to N (0 < N < 100000) in words in lexicographical order.

Examples :

Input: N = 11
Output: eight, eleven, five, four, nine, one, seven, six, three, two
Explanation: 
The numbers from 1 to N is 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. 
Their respective representations in words are {one, two, three, four, five, six, seven, eight, nine, ten, eleven}. 
Their correct lexicographical order is {eight, eleven, five, four, nine, one, seven, six, ten, three, two}.

Input: N = 5
Output: five, four, one, three, two
Explanation: 
The numbers from 1 to N is 1, 2, 3, 4, 5. 
Their respective representations in words are {one, two, three, four, five}. 
Their correct lexicographical order is {five, four, one, three, two}.

 

Approach: Follow the steps below to solve the problem:

  1. Initialize an array words[] of size N + 1 which stores the strings representations of each index from 1 to N at respective indices.
  2. Convert all numbers from 1 to N to words and store them at their corresponding indices.
  3. Sort the array words[] in ascending order.
  4. Print the elements present in the array words[].

Below is the implementation of the above approach: 

C++




#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
 
using namespace std;
 
// Function to convert a number to words
string number_to_words(int n) {
    // Stores the digits
    vector<string> ones {"","one","two","three","four","five","six","seven","eight","nine"};
    vector<string> tens {"","","twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety"};
    vector<string> teens {"ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen"};
 
    // Convert a two-digit number to words
    auto convert_two_digits = [&](int num) {
        if (num < 10) {
            return ones[num];
        } else if (num < 20) {
            return teens[num-10];
        } else {
            return tens[num/10] + (num%10==0 ? "" : " " + ones[num%10]);
        }
    };
 
    // Convert a three-digit number to words
    auto convert_three_digits = [&](int num) {
        if (num < 100) {
            return convert_two_digits(num);
        } else {
            return ones[num/100] + " hundred" + (num%100==0 ? "" : " and " + convert_two_digits(num%100));
        }
    };
 
    // Convert a number to words
    if (n < 100) {
        return convert_two_digits(n);
    } else if (n < 1000) {
        return convert_three_digits(n);
    } else {
        return "number out of range";
    }
}
 
// Function to print all the numbers up to n in lexicographical order
void print_numbers_in_words(int n) {
    // Convert all numbers to words
    vector<string> words;
    for (int i = 1; i <= n; i++) {
        words.push_back(number_to_words(i));
    }
 
    // Sort all strings
    sort(words.begin(), words.end());
 
    // Print the words in lexicographical order
    for (int i = 0; i < words.size(); i++) {
        cout << words[i] << ", ";
    }
}
 
// Driver code
int main() {
    int n = 15;
    print_numbers_in_words(n);
    return 0;
}


Java




import java.util.Arrays;
public class NumberToWords {
    // Stores the digits
    private static final String[] ones = {"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
    private static final String[] tens = {"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};
    private static final String[] teens = {"ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"};
 
    // Convert a two-digit number to words
    private static String convertTwoDigits(int num) {
        if (num < 10) {
            return ones[num];
        } else if (num < 20) {
            return teens[num - 10];
        } else {
            return tens[num / 10] + (num % 10 == 0 ? "" : " " + ones[num % 10]);
        }
    }
 
    // Convert a three-digit number to words
    private static String convertThreeDigits(int num) {
        if (num < 100) {
            return convertTwoDigits(num);
        } else {
            return ones[num / 100] + " hundred" + (num % 100 == 0 ? "" : " and " + convertTwoDigits(num % 100));
        }
    }
 
    // Convert a number to words
    public static String convertToWords(int num) {
        if (num < 100) {
            return convertTwoDigits(num);
        } else if (num < 1000) {
            return convertThreeDigits(num);
        } else {
            return "number out of range";
        }
    }
 
    // Print all the numbers up to n in lexicographical order
    public static void printNumbersInWords(int n) {
        // Convert all numbers to words
        String[] words = new String[n];
        for (int i = 1; i <= n; i++) {
            words[i - 1] = convertToWords(i);
        }
 
        // Sort all strings
        Arrays.sort(words);
 
        // Print the words in lexicographical order
        System.out.println(String.join(", ", words));
    }
 
    // Driver code
    public static void main(String[] args) {
        int n = 15;
        printNumbersInWords(n);
    }
}


Python3




# Function to convert a number to words
def number_to_words(n):
    # Stores the digits
    ones = ['','one','two','three','four','five','six','seven','eight','nine']
    tens = ['','','twenty','thirty','forty','fifty','sixty','seventy','eighty','ninety']
    teens = ['ten','eleven','twelve','thirteen','fourteen','fifteen','sixteen','seventeen','eighteen','nineteen']
 
    # Convert a two-digit number to words
    def convert_two_digits(num):
        if num < 10:
            return ones[num]
        elif num < 20:
            return teens[num-10]
        else:
            return tens[num//10] + ('' if num%10==0 else ' ' + ones[num%10])
 
    # Convert a three-digit number to words
    def convert_three_digits(num):
        if num < 100:
            return convert_two_digits(num)
        else:
            return ones[num//100] + ' hundred' + ('' if num%100==0 else ' and ' + convert_two_digits(num%100))
 
    # Convert a number to words
    if n < 100:
        return convert_two_digits(n)
    elif n < 1000:
        return convert_three_digits(n)
    else:
        return 'number out of range'
 
# Function to print all the numbers up to n in lexicographical order
def print_numbers_in_words(n):
    # Convert all numbers to words
    words=[]
    for i in range(1, n+1):
      words.append(number_to_words(i))
 
    # Sort all strings
    words.sort()
 
    # Print the words in lexicographical order
    print(', '.join(words))
 
# Driver code
if __name__ == "__main__":
    n = 15
    print_numbers_in_words(n)


C#




using System;
using System.Collections.Generic;
 
public class NumberToWords
{
    // Stores the digits
    private static readonly string[] Ones = {"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
    private static readonly string[] Tens = {"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};
    private static readonly string[] Teens = {"ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"};
 
    // Convert a two-digit number to words
    private static string ConvertTwoDigits(int num)
    {
        if (num < 10)
        {
            return Ones[num];
        }
        else if (num < 20)
        {
            return Teens[num - 10];
        }
        else
        {
            return Tens[num / 10] + (num % 10 == 0 ? "" : " " + Ones[num % 10]);
        }
    }
 
    // Convert a three-digit number to words
    private static string ConvertThreeDigits(int num)
    {
        if (num < 100)
        {
            return ConvertTwoDigits(num);
        }
        else
        {
            return Ones[num / 100] + " hundred" + (num % 100 == 0 ? "" : " and " + ConvertTwoDigits(num % 100));
        }
    }
 
    // Convert a number to words
    public static string ConvertNumberToWords(int n)
    {
        if (n < 100)
        {
            return ConvertTwoDigits(n);
        }
        else if (n < 1000)
        {
            return ConvertThreeDigits(n);
        }
        else
        {
            return "number out of range";
        }
    }
 
    // Print all the numbers up to n in lexicographical order
    public static void PrintNumbersInWords(int n)
    {
        // Convert all numbers to words
        List<string> words = new List<string>();
        for (int i = 1; i <= n; i++)
        {
            words.Add(ConvertNumberToWords(i));
        }
 
        // Sort all strings
        words.Sort();
 
        // Print the words in lexicographical order
        Console.WriteLine(string.Join(", ", words));
    }
 
    // Main method
    public static void Main(string[] args)
    {
        int n = 15;
        PrintNumbersInWords(n);
    }
}


Javascript




<script>
function numberToWords(n) {
  // Stores the digits
  const ones = ['', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine'];
  const tens = ['', '', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety'];
  const teens = ['ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen'];
 
  // Convert a two-digit number to words
  function convertTwoDigits(num) {
    if (num < 10) {
      return ones[num];
    } else if (num < 20) {
      return teens[num - 10];
    } else {
      return tens[Math.floor(num / 10)] + (num % 10 === 0 ? '' : ' ' + ones[num % 10]);
    }
  }
 
  // Convert a three-digit number to words
  function convertThreeDigits(num) {
    if (num < 100) {
      return convertTwoDigits(num);
    } else {
      return ones[Math.floor(num / 100)] + ' hundred' + (num % 100 === 0 ? '' : ' and ' + convertTwoDigits(num % 100));
    }
  }
 
  // Convert a number to words
  if (n < 100) {
    return convertTwoDigits(n);
  } else if (n < 1000) {
    return convertThreeDigits(n);
  } else {
    return 'number out of range';
  }
}
 
// Function to print all the numbers up to n in lexicographical order
function printNumbersInWords(n) {
  // Convert all numbers to words
  const words = [];
  for (let i = 1; i <= n; i++) {
    words.push(numberToWords(i));
  }
 
  // Sort all strings
  words.sort();
 
  // Print the words in lexicographical order
  console.log(words.join(', '));
}
 
// Driver code
const n = 15;
printNumbersInWords(n);
 
</script>


Output: 

eight, eleven, fifteen, five, four, fourteen, nine, one, seven, six, ten, thirteen, three, twelve, two

Time Complexity: O(NlogN) where N is the given integer.

Auxiliary Space: O(N)



Last Updated : 18 May, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads