Encuentre el nombre de la columna de Excel de un número de columna dado

Las columnas de MS Excel tienen un patrón como A, B, C, …, Z, AA, AB, AC, …., AZ, BA, BB, … ZZ, AAA, AAB ….. etc. En otras palabras, la columna 1 es denominada «A», la columna 2 como «B» y la columna 27 como «AA».
Dado un número de columna, encuentre su nombre de columna de Excel correspondiente. Los siguientes son más ejemplos.

Input          Output
 26             Z
 51             AY
 52             AZ
 80             CB
 676            YZ
 702            ZZ
 705            AAC

Gracias a Mrigank Dembla por sugerir la siguiente solución en un comentario.
Supongamos que tenemos un número n, digamos 28. Por lo tanto, en correspondencia con él, debemos imprimir el nombre de la columna. Necesitamos tomar el resto con 26. 

Si el resto con 26 resulta ser 0 (lo que significa 26, 52, etc.), entonces ponemos ‘Z’ en la string de salida y la nueva n se convierte en n/26 -1 porque aquí estamos considerando que 26 es ‘Z’ mientras que en realidad es el 25 con respecto a ‘A’.

Del mismo modo, si el resto resulta ser distinto de cero. (como 1, 2, 3, etc.), entonces solo necesitamos insertar el carácter correspondiente en la string y hacer n = n/26.

Finalmente, invertimos la string e imprimimos. 

Ejemplo: 
n = 700
El resto (n%26) es 24. Entonces ponemos ‘X’ en la string de salida y n se convierte en n/26, que es 26. El 
resto (26%26) es 0. Entonces ponemos ‘Z’ en la string de salida y n se convierte en n/26 -1, que es 0.

A continuación se muestra la implementación del enfoque anterior.

C++

// C++ program to find Excel
// column name from a given
// column number
#include <bits/stdc++.h>
#define MAX 50
using namespace std;
 
// Function to print Excel column name for a given column number
void printString(int n)
{
    char str[MAX]; // To store result (Excel column name)
    int i = 0; // To store current index in str which is result
 
    while (n > 0) {
        // Find remainder
        int rem = n % 26;
 
        // If remainder is 0, then a 'Z' must be there in output
        if (rem == 0) {
            str[i++] = 'Z';
            n = (n / 26) - 1;
        }
        else // If remainder is non-zero
        {
            str[i++] = (rem - 1) + 'A';
            n = n / 26;
        }
    }
    str[i] = '\0';
 
    // Reverse the string and print result
    reverse(str, str + strlen(str));
    cout << str << endl;
 
    return;
}
 
// Driver program to test above function
int main()
{
    printString(26);
    printString(51);
    printString(52);
    printString(80);
    printString(676);
    printString(702);
    printString(705);
    return 0;
}

Java

// Java program to find Excel
// column name from a given
// column number
 
public class ExcelColumnTitle {
    // Function to print Excel column
    // name for a given column number
    private static void printString(int columnNumber)
    {
        // To store result (Excel column name)
        StringBuilder columnName = new StringBuilder();
 
        while (columnNumber > 0) {
            // Find remainder
            int rem = columnNumber % 26;
 
            // If remainder is 0, then a
            // 'Z' must be there in output
            if (rem == 0) {
                columnName.append("Z");
                columnNumber = (columnNumber / 26) - 1;
            }
            else // If remainder is non-zero
            {
                columnName.append((char)((rem - 1) + 'A'));
                columnNumber = columnNumber / 26;
            }
        }
 
        // Reverse the string and print result
        System.out.println(columnName.reverse());
    }
 
    // Driver program to test above function
    public static void main(String[] args)
    {
        printString(26);
        printString(51);
        printString(52);
        printString(80);
        printString(676);
        printString(702);
        printString(705);
    }
}
 
// This code is contributed by Harikrishnan Rajan

Python

# Python program to find Excel column name from a
# given column number
 
MAX = 50
 
# Function to print Excel column name
# for a given column number
def printString(n):
 
    # To store result (Excel column name)
    string = ["\0"] * MAX
 
    # To store current index in str which is result
    i = 0
 
    while n > 0:
        # Find remainder
        rem = n % 26
 
        # if remainder is 0, then a
        # 'Z' must be there in output
        if rem == 0:
            string[i] = 'Z'
            i += 1
            n = (n / 26) - 1
        else:
            string[i] = chr((rem - 1) + ord('A'))
            i += 1
            n = n / 26
    string[i] = '\0'
 
    # Reverse the string and print result
    string = string[::-1]
    print "".join(string)
 
# Driver program to test the above Function
printString(26)
printString(51)
printString(52)
printString(80)
printString(676)
printString(702)
printString(705)
 
# This code is contributed by BHAVYA JAIN

C#

// C# program to find Excel
// column name from a given
// column number
using System;
 
class GFG{
     
static String reverse(String input)
{
    char[] reversedString = input.ToCharArray();
    Array.Reverse(reversedString);
    return new String(reversedString);
}
 
// Function to print Excel column
// name for a given column number
private static void printString(int columnNumber)
{
     
    // To store result (Excel column name)
    String columnName = "";
 
    while (columnNumber > 0)
    {
         
        // Find remainder
        int rem = columnNumber % 26;
 
        // If remainder is 0, then a
        // 'Z' must be there in output
        if (rem == 0)
        {
            columnName += "Z";
            columnNumber = (columnNumber / 26) - 1;
        }
         
        // If remainder is non-zero
        else
        {
            columnName += (char)((rem - 1) + 'A');
            columnNumber = columnNumber / 26;
        }
    }
 
    // Reverse the string
    columnName = reverse(columnName);
     
    // Print result
    Console.WriteLine(columnName.ToString());
}
 
// Driver code
public static void Main(String[] args)
{
    printString(26);
    printString(51);
    printString(52);
    printString(80);
    printString(676);
    printString(702);
    printString(705);
}
}
 
// This code is contributed by amal kumar choubey

Javascript

<script>
// Javascript program to find Excel
// column name from a given
// column number
 
// Function to print Excel column
    // name for a given column number
function printString(columnNumber)
{
    // To store result (Excel column name)
        let columnName = [];
  
        while (columnNumber > 0) {
            // Find remainder
            let rem = columnNumber % 26;
  
            // If remainder is 0, then a
            // 'Z' must be there in output
            if (rem == 0) {
                columnName.push("Z");
                columnNumber = Math.floor(columnNumber / 26) - 1;
            }
            else // If remainder is non-zero
            {
                columnName.push(String.fromCharCode((rem - 1) + 'A'.charCodeAt(0)));
                columnNumber = Math.floor(columnNumber / 26);
            }
        }
  
        // Reverse the string and print result
        document.write(columnName.reverse().join("")+"<br>");
}
 
// Driver program to test above function
printString(26);
printString(51);
printString(52);
printString(80);
printString(676);
printString(702);
printString(705);
 
 
// This code is contributed by rag2127
</script>
Producción

Z
AY
AZ
CB
YZ
ZZ
AAC

Complejidad de tiempo: O (log 26 n), ya que estamos usando un ciclo y en cada recorrido, decrementamos por división de piso de 26.

Espacio auxiliar: O(50), ya que estamos usando espacio adicional para almacenar el resultado.
Método 2 
El problema es similar a convertir un número decimal a su representación binaria pero en lugar de un sistema de base binaria donde tenemos dos dígitos solo 0 y 1, aquí tenemos 26 caracteres de AZ.
Entonces, estamos tratando con base 26 en lugar de base binaria. 
No es ahí donde termina la diversión, no tenemos cero en este sistema numérico, ya que A representa 1, B representa 2 y así Z representa 26. 
Para que el problema sea fácilmente comprensible, abordamos el problema en dos pasos:

  1. Convierta el número a la representación de base 26, considerando que también tenemos 0 en el sistema.
  2. Cambia la representación a la que no tiene 0 en su sistema.

¿CÓMO? Aquí hay un ejemplo

Paso 1: 
Considere que tenemos el número 676, ¿Cómo obtener su representación en el sistema base 26? De la misma manera, para un sistema binario, en lugar de dividir y dejar resto por 2, hacemos división y resto entre 26.

Base 26 representation of 676 is : 100 

Paso 2
Pero bueno, no podemos tener cero en nuestra representación. ¿Derecha? Porque no es parte de nuestro sistema numérico. ¿Cómo nos deshacemos del cero? Bueno, es simple, pero antes de hacerlo, recordemos un simple truco matemático:

Subtraction: 
5000 - 9, How do you subtract 9 from 0 ? You borrow
from next significant bit, right.  
  • En un sistema numérico decimal para tratar con cero, tomamos prestado 10 y restamos 1 del siguiente significativo.
  • En el sistema numérico de base 26, para manejar el cero, tomamos prestado 26 y restamos 1 del siguiente bit significativo.

Entonces, convierta 100 26 a un sistema numérico que no tenga ‘0’, obtenemos (25 26) 26 
La representación simbólica del mismo es: YZ 

Aquí está la implementación de la misma:

C++

#include <iostream>
using namespace std;
 
void printString(int n)
{
    int arr[10000];
    int i = 0;
 
    // Step 1: Converting to number assuming
    // 0 in number system
    while (n) {
        arr[i] = n % 26;
        n = n / 26;
        i++;
    }
 
    // Step 2: Getting rid of 0, as 0 is
    // not part of number system
    for (int j = 0; j < i - 1; j++) {
        if (arr[j] <= 0) {
            arr[j] += 26;
            arr[j + 1] = arr[j + 1] - 1;
        }
    }
 
    for (int j = i; j >= 0; j--) {
        if (arr[j] > 0)
            cout << char('A' + arr[j] - 1);
    }
 
    cout << endl;
}
 
// Driver program to test above function
int main()
{
    printString(26);
    printString(51);
    printString(52);
    printString(80);
    printString(676);
    printString(702);
    printString(705);
    return 0;
}
 
// This code is contributed by Ankur Goel

Java

import java.util.*;
 
class GFG{
 
static void printString(int n)
{
    int []arr = new int[10000];
    int i = 0;
 
    // Step 1: Converting to number
    // assuming 0 in number system
    while (n > 0)
    {
        arr[i] = n % 26;
        n = n / 26;
        i++;
    }
 
    // Step 2: Getting rid of 0, as 0 is
    // not part of number system
    for(int j = 0; j < i - 1; j++)
    {
        if (arr[j] <= 0)
        {
            arr[j] += 26;
            arr[j + 1] = arr[j + 1] - 1;
        }
    }
 
    for(int j = i; j >= 0; j--)
    {
        if (arr[j] > 0)
            System.out.print(
                (char)('A' + arr[j] - 1));
    }
    System.out.println();
}
 
// Driver code
public static void main(String[] args)
{
    printString(26);
    printString(51);
    printString(52);
    printString(80);
    printString(676);
    printString(702);
    printString(705);
}
}
 
// This code is contributed by amal kumar choubey

Python3

def printString(n):
     
    arr = [0] * 10000
    i = 0
 
    # Step 1: Converting to number
    # assuming 0 in number system
    while (n > 0):
        arr[i] = n % 26
        n = int(n // 26)
        i += 1
         
    #Step 2: Getting rid of 0, as 0 is
    # not part of number system
    for j in range(0, i - 1):
        if (arr[j] <= 0):
            arr[j] += 26
            arr[j + 1] = arr[j + 1] - 1
 
    for j in range(i, -1, -1):
        if (arr[j] > 0):
            print(chr(ord('A') +
                  (arr[j] - 1)), end = "");
 
    print();
 
# Driver code
if __name__ == '__main__':
     
    printString(26);
    printString(51);
    printString(52);
    printString(80);
    printString(676);
    printString(702);
    printString(705);
 
# This code is contributed by Princi Singh

C#

using System;
class GFG{
 
static void printString(int n)
{
  int []arr = new int[10000];
  int i = 0;
 
  // Step 1: Converting to
  // number assuming 0 in
  // number system
  while (n > 0)
  {
    arr[i] = n % 26;
    n = n / 26;
    i++;
  }
 
  // Step 2: Getting rid of 0,
  // as 0 is not part of number
  // system
  for(int j = 0; j < i - 1; j++)
  {
    if (arr[j] <= 0)
    {
      arr[j] += 26;
      arr[j + 1] = arr[j + 1] - 1;
    }
  }
 
  for(int j = i; j >= 0; j--)
  {
    if (arr[j] > 0)
      Console.Write((char)('A' +
                     arr[j] - 1));
  }
  Console.WriteLine();
}
 
// Driver code
public static void Main(String[] args)
{
  printString(26);
  printString(51);
  printString(52);
  printString(80);
  printString(676);
  printString(702);
  printString(705);
}
}
 
// This code is contributed by 29AjayKumar

Javascript

<script>
 
function printString(n){
    let arr = [];
    let i = 0;
 
    // Step 1: Converting to number assuming
    // 0 in number system
    while (n) {
        arr[i] = n % 26;
        n = Math.floor(n / 26);
        i++;
    }
 
    // Step 2: Getting rid of 0, as 0 is
    // not part of number system
    for (let j = 0; j < i - 1; j++) {
        if (arr[j] <= 0) {
            arr[j] += 26;
            arr[j + 1] = arr[j + 1] - 1;
        }
    }
    let ans = '';
    for (let j = i; j >= 0; j--) {
        if (arr[j] > 0)
            ans += String.fromCharCode(65 + arr[j] - 1);
    }
 
    document.write(ans + "<br>");
}
 
// Driver program to test above function
 
printString(26);
printString(51);
printString(52);
printString(80);
printString(676);
printString(702);
printString(705);
 
</script>
Producción

Z
AY
AZ
CB
YZ
ZZ
AAC

Complejidad de tiempo: O (log 26 n), ya que estamos usando un ciclo y en cada recorrido, decrementamos por división de piso de 26.

Espacio auxiliar: O (10000), ya que estamos usando espacio adicional para la array.

Método 3:

Podemos usar una función recursiva que definitivamente reduce el tiempo y aumenta la eficiencia:

Los alfabetos están en orden secuencial como: ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’. Ha experimentado al usar Excel cuando ve que la numeración de columnas y filas se realiza en forma alfabética.

Así es como pienso a propósito sobre la lógica de cómo se organiza.

(En términos matemáticos, [a, b] significa de ‘a’ a ‘b’).

[1,26] = [A,Z] (Entienda por ‘1’ significa ‘A’ y ’26” significa “Z”). Para [27,52] ,será como [AA,AZ], Para [57,78] será [BA,BZ]

La lógica es agregar un Alfabeto secuencialmente cada vez que termina numerándose en 26.

Por ejemplo, si el número es ’27’, que es mayor que ’26’, entonces simplemente tenemos que dividir por 26 y obtenemos el resto como 1. Vemos «1» como «A» y se puede hacer de forma recursiva.

Usaremos python para esto.

algoritmo es:

1. Tome una array y ordene las letras de la A a la Z. (También puede usar la string de importación y la función de string para obtener «A a Z» en mayúsculas).

2. Si el número es menor o igual a ’26’, simplemente obtenga la letra de la array e imprímala.

3. Si es mayor que 26, use la regla del resto del cociente, si el resto es cero, hay 2 formas posibles, si el cociente es «1», simplemente extraiga la letra del índice [r-1] (‘ r’ es el resto), de lo contrario llame a la función desde el num =(q-1) y agregue al frente a la indexación de letras [r-1].

4. Si el resto no es igual a «0», llame a la función para el num = (q) y añada al principio la indexación de letras [r-1].

El código relacionado con esto es:

C++

#include<bits/stdc++.h>
using namespace std;
 
// Or you can simply take a string and perform this logic ,no issue i found in here.
string alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 
// defined a recursive function here.
// if number is less than "26", simply hash out (index-1)
// There are sub possibilities in possibilities,
// 1.if remainder is zero(if quotient is 1 or not 1) and
// 2. if remainder is not zero
string num_hash(int num){
    if(num < 26){
      string res = "";
      res += alpha[num-1];
      return res;
    }
    else{
      int q = (num / 26);
      int r = num % 26;
      string res = "";
      if(r == 0){
        if(q == 1){
          res.append(1,alpha[(26 + r-1)%26]);
        }
        else{
          res = num_hash(q-1);
          res.append(1,alpha[(26 + r-1)%26]);
        }
      }
      else{
        res = num_hash(q);
        res.append(1,alpha[(26 + r-1)%26]);
      }
      return res;
    }
}
 
int main () {
 
    cout<< num_hash(26) << endl;
    cout<< num_hash(51) << endl;
    cout<< num_hash(52) << endl;
    cout<< num_hash(80) << endl;
    cout<< num_hash(676) << endl;
    cout<< num_hash(702) << endl;
    cout<< num_hash(705) << endl;
 
    return 0;
 
}
 
// This code is contributed by shinjanpatra

Java

/*package whatever //do not write package name here */
import java.io.*;
class GFG
{
 
  // Or you can simply take a string and perform this logic ,no issue i found in here.
  static String alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 
  // defined a recursive function here.
  // if number is less than "26", simply hash out (index-1)
  // There are sub possibilities in possibilities,
  // 1.if remainder is zero(if quotient is 1 or not 1) and
  // 2. if remainder is not zero
  static String num_hash(int num){
    if(num < 26)
      return Character.toString(alpha.charAt(num-1));
    else{
      int q = Math.floorDiv(num, 26);
      int r = num % 26;
      if(r == 0){
        if(q == 1){
          return Character.toString(alpha.charAt((26 + r-1)%26));
        }
        else
          return num_hash(q-1) + alpha.charAt((26 + r-1)%26);
      }
      else
        return num_hash(q) + alpha.charAt((26 + r-1)%26);
    }
  }
 
  public static void main (String[] args) {
 
    System.out.println(num_hash(26));
    System.out.println(num_hash(51));
    System.out.println(num_hash(52));
    System.out.println(num_hash(80));
    System.out.println(num_hash(676));
    System.out.println(num_hash(702));
    System.out.println(num_hash(705));
 
  }
}
 
// This code is contributed by shinjanpatra

Python3

# Or you can simply take a string and perform this logic ,no issue i found in here.
alpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
# defined a recursive function here.
# if number is less than "26", simply hash out (index-1)
# There are sub possibilities in possibilities,
# 1.if remainder is zero(if quotient is 1 or not 1) and
# 2. if remainder is not zero
 
def num_hash(num):
    if num < 26:
        return alpha[num-1]
    else:
        q, r = num//26, num % 26
        if r == 0:
            if q == 1:
                return alpha[r-1]
            else:
                return num_hash(q-1) + alpha[r-1]
        else:
            return num_hash(q) + alpha[r-1]
 
 
# Calling the function out here and printing the ALphabets
# This code is robust ,work for any positive integer only.
# You can try as much as you want
print(num_hash(26))
print(num_hash(51))
print(num_hash(52))
print(num_hash(80))
print(num_hash(676))
print(num_hash(702))
print(num_hash(705))

Javascript

<script>
 
// Or you can simply take a string and perform this logic ,no issue i found in here.
let alpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
 
// defined a recursive function here.
// if number is less than "26", simply hash out (index-1)
// There are sub possibilities in possibilities,
// 1.if remainder is zero(if quotient is 1 or not 1) and
// 2. if remainder is not zero
function num_hash(num)
{
    if(num < 26)
        return alpha[num-1]
    else{
        let q = Math.floor(num/26),r = num % 26
        if(r == 0){
            if(q == 1)
                return alpha[(26 + r-1)]
            else
                return num_hash(q-1) + alpha[(26 + r-1)]
        }
        else
            return num_hash(q) + alpha[r-1]
    }
}
 
// Calling the function out here and printing the ALphabets
// This code is robust ,work for any positive integer only.
// You can try as much as you want
document.write(num_hash(26),"</br>")
document.write(num_hash(51),"</br>")
document.write(num_hash(52),"</br>")
document.write(num_hash(80),"</br>")
document.write(num_hash(676),"</br>")
document.write(num_hash(702),"</br>")
document.write(num_hash(705),"</br>")
 
// This code is contributed by shinjanpatra
 
</script>
Producción

Z
AY
AZ
CB
YZ
ZZ
AAC

Complejidad de tiempo: O (log 26 n), ya que estamos usando recursividad y en cada llamada recursiva, decrementamos por división de piso de 26.

Espacio auxiliar: O(1), ya que no estamos utilizando ningún espacio adicional.
Artículo relacionado: 
Encuentre el número de columna de Excel a partir del título de la columna
Este artículo es una contribución de Kartik . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *