【算法】整数转Excel地址问题(详细思考过程)

这题目感觉就是考数学找规律的。。找的出规律自然就可以解了,下面来讲下我的思考过程。

先上题目:

Excel地址
Excel单元格的地址表示很有趣,它使用字母来表示列号,比如:
A表示第1列,
B表示第2列,
Z表示第26列,
AA表示第27列,
AB表示第28列,
BA表示第53列,
….
当然Excel的最大列号是有限度的,所以转换起来不难。
如果我们想把这种表示法一般化,可以把很大的数字转换为很长的字母序列呢?

本题目既是要求对输入的数字, 输出其对应的Excel地址表示方式。

例如,
输入:
26
则程序应该输出:
Z

再例如,
输入:
2054
则程序应该输出:
BZZ

我们约定,输入的整数范围[1,2147483647]

 

一开始,我想用进制转换的方式来做,但是推算到后面发现不行。。想了许久,决定从结果逆推出其规律。

如题目中测试用例 ↓

                              输入:2054  输出: BZZ。

我们将十进制转化成二进制一般可以这样做:

由此我们大胆地将2054和BZZ写成这样:

那上面3个问号里的值是什么呢?最后一个问号里值为0,因为在上面二进制转换求余数时如果商为0即代表结束,不再求余。

所以第二问号的值可得 0 * 26 + 2 = 2

第三个问号的值可得 2 * 26 + 26 = 78

所以最终结果为:

从上图中我们可以发现这样的一个规律:

当整数n可被26整除时(即n%26==0),可以看作先将 n-26 再除以26,这样就可以得到一个余数26。

所以,对应的代码随即产生了!

import java.util.Scanner;
import java.util.Stack;
public class Excel地址 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        Stack<Integer> stack = new Stack();
        /*核心部分 Start*/
        while(n!=0){
            if(n%26==0) n-=26;
            stack.push(n%26==0?26:n%26);
            n/=26;
        }
        /*核心部分 End*/
       while (!stack.isEmpty())
            System.out.print((char)('A'+stack.pop().intValue()-1));
       sc.close();
    }
}

下面对核心部分代码进行讲解:

当整数n不等于0时进入循环体后,首先判断n是否被能被26整除,若能则将n-26。接着将余数塞入

(未完待续)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值