您的位置:首页 > 编程语言

编程题—geohash编码

2018-01-02 16:20 197 查看
内容会持续更新,有错误的地方欢迎指正,谢谢!

问题

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;

输入描述:

输入包括一个整数n,(-90 ≤ n ≤ 90)

输出描述:

输出二进制编码

输入例子:

80

输出例子:

111100

分析

二分法的简单应用

值在左区间记为0,在右区间记为1

由于精度为6,所以直接迭代6次即可。。

所用数据结构: vector

代码

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

void DividFunc(int num,int beginVal,int endVal)//迭代实现
{
int mid;
vector<int> res;
for(int i=0;i<6;++i)
{
mid=(beginVal+endVal+1)/2;//这里需要注意+1,你体会一下就知道啦~
if(num>=mid)
{
res.push_back(1);
beginVal=mid;
}
else
{
res.push_back(0);
endVal=mid-1;
}
}
for(int i=0;i<6;++i)
{
cout<<res[i];
}
cout<<endl;
}

int main()
{
int num;
while(cin>>num)
{
DividFunc(num,-90,90);
}
return 0;
}


总结:挺简单的一道题,看着题目信息量很大的题反而简单,排在后面的题一般也不难。所以,各位不要因为题的信息量大或排在后面而产生畏难心理!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息