1. 程式人生 > >geohash編碼 ——騰訊

geohash編碼 ——騰訊

題目描述

geohash編碼:geohash常用於將二維的經緯度轉換為字串,分為兩步:第一步是經緯度的二進位制編碼,第二步是base32轉碼。
此題考察緯度的二進位制編碼:演算法對緯度[-90, 90]通過二分法進行無限逼近(取決於所需精度,本題精度為6)。注意,本題進行二分法逼近過程中只採用向下取整來進行二分,針對二分中間值屬於右區間。演算法舉例如下: 針對緯度為80進行二進位制編碼過程:
1) 區間[-90, 90]進行二分為[-90, 0),[0, 90],成為左右區間,可以確定80為右區間,標記為1;
2) 針對上一步的右區間[0, 90]進行二分為[0, 45),[45, 90],可以確定80是右區間,標記為1;
3) 針對[45, 90]進行二分為[45, 67),[67,90],可以確定80為右區間,標記為1;
4) 針對[67,90]進行二分為[67, 78),[78,90],可以確定80為右區間,標記為1;
5) 針對[78, 90]進行二分為[78, 84),[84, 90],可以確定80為左區間,標記為0;
6) 針對[78, 84)進行二分為[78, 81), [81, 84),可以確定80為左區間,標記為0;

 

#include<iostream>
using namespace std;
int main()
{
    int n;
    int left = -90;
    int right = 90;
    //char* res = new char[7];
    //res[6] = 0;
    cin >> n;
    for(int i = 0; i <6; i++)
    {
        int mid = (left + right)/2;
        if(n < mid)
        {
            //res[i] = 0;
            cout << 0;
            right = mid;
        }
        else
        {
            cout << 1;
            //res[i] = 1;
            left = mid;
        }
    }
    cout << endl;
    return 0;
    //cout << res << endl;
    //delete[] res;
    //return 0;
}

注意:

(1)開始用的輸出格式不對,報錯,不知道為什麼不能儲存在動態分配的記憶體裡,再輸出

(2)可以再加一步判斷輸入是不是在-90~90的有效範圍。