Google CodeJam习题:Alien Numbers

题目见:http://code.google.com/codejam/contest/32003/dashboard

思路:

简单的进制转换程序。首先转化成计算机里的数据,这样才能进行除法和取余,然后再转化为输出数据。

题解:

#include <iostream>
#include <fstream>
#include <string>
#include <array>
#include <algorithm>

void translate (
    const std::string& alien_number,
    const std::string& src,
    const std::string& tgt)
{
    const char src_set = src.size();
    const char tgt_set = tgt.size();

    std::array<char, 256> src_mapping;
    
    for (char i = 0; i < src_set; ++i)
        src_mapping[src[i]] = i;
        
    long dec_value = 0;
    for (auto& ach : alien_number)
        dec_value *= src_set, dec_value += src_mapping[ach];
        
    std::string output;
    do
    {
        output += tgt[dec_value % tgt_set];
        dec_value /= tgt_set;
    }
    while (dec_value != 0);
    std::reverse (std::begin (output), std::end (output));
    
    std::cout<<output<<std::endl;
}

int main (int argc, char* argv[])
{
    if (argc != 2)
        return 1;
        
    std::ifstream ifs;
    ifs.open(argv[1]);
    if (!ifs.is_open())
        return 1;
        
    int num_aliens;
    ifs>>num_aliens;
    
    for (int i = 0; i < num_aliens; ++i)
    {
        std::string alien_number;
        std::string src_lang;
        std::string tar_lang;
        
        ifs>>alien_number>>src_lang>>tar_lang;
        
        std::cout<<"Case #"<<i+1<<": ";
        translate (alien_number, src_lang, tar_lang);
    }
    
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值