十进制和26进制转换算法
【问题描述】
在Excel中,列的名称是这样一个递增序列:A、B、C、…、Z、AA、AB、AC、…、AZ、BA、BB、BC、…、BZ、CA、…、ZZ、AAA、AAB…。
我们需要将上述列名序列和以下自然数序列相互转换:1、2、3、…。
【问题分析】
经过分析,我们不难发现,这是一个26进制和十进制相互转换的问题。序列A-Z依次对应序列1-26。进制转换的基本办法就是“取余法”,换算规则如下:
ABZ = 1*26² + 2 * 26¹ + 26*26°= 676 + 52 + 26 = 754
于是,我们就知道该如何设计一个十进制转换为26进制的算法了。
【算法描述】
Step1.[取余] 用指定自然数n除以26,得到一个余数m。如果m = 0,置m←26。
Step2.[转换为字符] 将m映射为字符c,映射规则是{1-26}->{A-Z}。然后将c拼接到26进制值s的左边,也就是置s←c + s。
Step3.[去余降幂] 置n←(n–m)/26。如果n > 0,则回到Step1继续执行,否则进入Step4。
Step4.[结束] 返回s。
按照上述思想,26进制转换为十进制的过程正好是相反的,而且实现起来也更为简单,在此不述。
c++代码:
#include<iostream>
#include <algorithm>
using namespace std;int main(){long long ans=0;string s;cin>>s;int len=s.size();for(int i=0,j=1;i<s.size();i++,j*=26){ans+=(int)(s[len-i-1]-64)*j;}cout<<ans<<endl; //26进制转十进制string str="";while(ans>0){int m=ans%26;if(m==0) m=26;str+=(char)(m+64);ans=(ans-m)/26;}reverse(str.begin(),str.end()); //反序 cout<<str<<endl; // 十进制转26进制 return 0;
}
C#源代码如下:
/// <summary>
/// 将指定的自然数转换为26进制表示。映射关系:[1-26] ->[A-Z]。
/// </summary>
/// <param name="n">自然数(如果无效,则返回空字符串)。</param>
/// <returns>26进制表示。</returns>
public static string ToNumberSystem26(int n){string s = string.Empty;while (n > 0){int m = n % 26;if (m == 0) m = 26;s = (char)(m + 64) + s;n = (n - m) / 26;}return s;
} /// <summary>
/// 将指定的26进制表示转换为自然数。映射关系:[A-Z] ->[1-26]。
/// </summary>
/// <param name="s">26进制表示(如果无效,则返回0)。</param>
/// <returns>自然数。</returns>
public static int FromNumberSystem26(string s){if (string.IsNullOrEmpty(s)) return 0; int n = 0;for (int i = s.Length - 1, j = 1; i >= 0; i--, j *= 26){char c = Char.ToUpper(s[i]);if (c < 'A' || c > 'Z') return 0;n += ((int)c - 64) * j;}return n;
}static void Main(string[] args){int[] numbers = { 1, 10, 26, 27, 256, 702, 703 };foreach (int n in numbers){string s = ToNumberSystem26(n);Console.WriteLine(n + "\t" + s + "\t" + FromNumberSystem26(s));}Console.ReadLine();
}
十进制和26进制转换算法相关推荐
- 笔记:JS仿excel十进制和26进制转换算法
笔记:JS仿excel十进制和26进制转换算法 引子:看过这篇文章用C#实现的十进制和26进制转换算法,觉得在前端以后会用到,遂改写出Javacript的写法. 十进制转26进制: function ...
- 十进制与26进制英文字母互转
最近在封装Excel组件,需要提供两个接口,分别根据单元索引和单元名称访问单元格.例如,GetCell(1, 2)和GetCell("A2"),这两种方法返回的结果是相同的.这里遇 ...
- 二进制 八进制 十进制 十六进制 之间进制转换(图解篇)
一.本文所涉及的内容(Contents) 目录 一.本文所涉及的内容(Contents) 二.背景(Contexts) 三.进制转换算法(Convert) ( ...
- 进制转换算法 (C语言实现一个简单的二进制转换工具) ------- 算法笔记010
进制转换算法概念 其核心是利用栈的存储结构性质,进行数据的入栈出栈时的计算,让后将计算好的数据存入另一个栈内,最后再出栈输出.由于栈的先进后出特性,最后输出的顺序和输入的顺序是一样的.具体如上图. 栈 ...
- 进制转换算法(通用,极简)
检索词: 进制转换.通用进制转换.二进制转十进制.二进制转八进制.二进制转十六进制. 十进制转二进制.十六进制转二进制.八进制转二进制.通用算法.字符型输入输出 一.英文先行 英文 中文 缩写 ...
- 计算机13E怎么转换成十进制,十六进制换算(进制转换计算器)
把下面的16进制转为10进制b35de1f058c72a7430241461cd504839dc27438e. 16进制转10进制16进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第 ...
- m进制转换为n进制-任意进制转换算法
这种题也是一道经典的面试题,主要考察进制转换细想,Coding质量等. 当我们把十进制转成二进制的时候,我们通过辗转相除,取余,逆置余数序列的过程得到新的进制的数.因此我们可以借助这种思想把M进制转成 ...
- 26英文字母加减26进制转换
package com.chinait.utils; /*** 算法输出(A后面的多少位的字符串,超过Z 则改为 AA 开始),相当于用26进制的加法过程,但是是由英文字母来定义的,使用场景在于处理e ...
- oracle转换为16进制,Oracle的十进制和16进制转换函数
Oracle的10进制和16进制转换函数 在数据库中,常常需要将10进制转16进制,又会需要将16进制转10进制.有两个使用PL/SQL开发的函数,可以方便使用. create or replace ...
最新文章
- Problem 62 Java中的final关键字?
- Chapter18-Export and Import Utilities
- 程序员永远不要再犯的5个编程错误
- python matplotlib 饼图标签重叠_Python绘制饼图调节字体大小、防止标签重叠解决方法...
- input file 上传文件格式限制
- python3.6安装tesserocr
- Val编程-按键响应模式
- 「前端」History API与浏览器历史堆栈管理
- 微机原理实验8254计算机钢琴,GitHub - SincereXIA/PianoMFC: 西电微机原理课设项目,键盘电子乐器演奏程序设计(电子琴),MFC...
- Redis:06---数据库管理
- python3怎么安装mysql_Python3下mysqlclient的安装和使用
- Android Unable to execute dex: java.nio.BufferOverflowException
- 2020电信最新套餐一览表_最新!2020年宁波中学排名一览表
- Python(二)JavaPython混合编程
- Pgadmin4转圈圈无法进入到界面(pgadmin v4一直卡在loading页面)
- html页面点击生成图片并可以下载图片
- 【路径规划】基于改进粒子群实现机器人栅格地图路径规划
- 介绍一个用于EOS区块链的RPC API接口的PHP开发包SDK
- VS1005 HiRes 高清播放器方案
- Excel公式向导,详细演艺多条件求平均值的操作