1. 程式人生 > >LeetCode 171 Excel Sheet Column Number(Excel的列向表數字)

LeetCode 171 Excel Sheet Column Number(Excel的列向表數字)

翻譯

給定一個出現在Excel表格上的列表標題,返回它的正確行數。  

例如:
    A -> 1
    B -> 2
    C -> 3
    ...
    Z -> 26
    AA -> 27
    AB -> 28 

原文

Given a column title as appear in an Excel sheet, return its corresponding column number.

For example:
    A -> 1
    B -> 2
    C -> 3
    ...
Z -> 26 AA -> 27 AB -> 28

分析

下面是上一題的部落格截圖,我舉了一個進位制轉換的例子,但是沒有說的很明確,那麼就在這一題裡充分說明一下好了,大家請繼續往下看。

這裡寫圖片描述

這裡寫圖片描述

相信有了這個示例,大家就可以秒懂了。

然後我就寫了如下程式碼:

#include <iostream>
using namespace std;

int exponent(int x, int y) {
    int answer = 1;
    for(int i = 0; i < y; ++ i) {
        answer *= x;
    }
    return
answer; } int titleToNumber(string s) { int n = 0, len = s.length(); for(int i = 0; i < s.length(); ++ i) { char c = s[i]; int chara = c - 'A' + 1; n += chara * exponent(26, len - 1 - i); } return n; } int main() { cout<<titleToNumber("AAB"); return
0; }

輸出結果是

704

這是正確的,後來我改成了如下程式碼:

#include <iostream>
#include <cmath>
using namespace std;

int titleToNumber(string s) {
    int n = 0, len = s.length();
    for(int i = 0; i < s.length(); ++ i) {
        char c = s[i];
        int chara = c - 'A' + 1;
        n += chara * pow(26, len - 1 - i);
    }
    return n;
}

int main() {
    cout<<titleToNumber("AAB");
    return 0;
}

輸出是:

703

於是我就納悶了,後來我從CodeBlocks換到餓了Visual Studio就成了704了,704是正確的。

這裡寫圖片描述

而在CB中把程式碼改成:

n += chara * (int)pow(26.0, len - 1 - i);

結果反而成了702了。

希望大家發現問題的在下面留言告訴我啊……

如果換成了double的話,在CB中也是OK的:

#include <iostream>
#include <cmath>
using namespace std;

double titleToNumber(string s) {
    double n = 0, len = s.length();
    for(int i = 0; i < s.length(); ++ i) {
        char c = s[i];
        double chara = c - 'A' + 1;
        double a = len - 1 - i;
        n += chara * pow(26.0, a);
    }
    return n;
}

int main() {
    cout<<titleToNumber("AAB");
    return 0;
}

問題是我好想知道它們在CB和VS內部是如何走的……

程式碼

class Solution {
public:
    int titleToNumber(string s) {
        int n = 0, len = s.length();
        for (int i = 0; i < s.length(); ++i) {
            char c = s[i];
            int chara = c - 'A' + 1;
            n += chara * pow(26, len - 1 - i);
        }
        return n;
    }
};