【華爲機試之C++】進制轉換

描述

写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。

数据范围:保证结果在 1≤n≤2^31−1

输入描述:

输入一个十六进制的数值字符串。

输出描述:

输出该数值的十进制字符串。不同组的测试用例用\n隔开。

示例1

輸入:0xAA
輸出:170

思路

  1. 使用單例模式
  2. 對於2的N次方可以使用左移運算表示,這樣效率高。但是需要注意,編譯器默認會將2的31次方推導為有符號數,也就變成了負數。所以不要用自動推導,使用顯式類型uint32_t。

代碼

NumericCast.h

#pragma once
#include <mutex>
#include <cstdint>

class NumericCast
{
public:
    static NumericCast* getInstance();

public:
    void hex2dec();
    void dec2hex();
    void hex2oct();
    void oct2hex();
    void dec2oct();
    void oct2dec();

    bool isValidData(int32_t data);

private:
    NumericCast() = default;
    ~NumericCast() = default;

private:
    static NumericCast* instance;
    static std::mutex iMutex;
};

NumericCast.cpp

#include <iostream>
#include "NumericCast.h"

NumericCast* NumericCast::instance = nullptr;
std::mutex NumericCast::iMutex;


NumericCast* NumericCast::getInstance()
{
    std::unique_lock<std::mutex> lock(iMutex);

    if (nullptr == instance) {
        instance = new NumericCast();
    }

    return instance;
}

void NumericCast::hex2dec()
{
    int32_t number;
    std::cin >> std::hex >> number;

    if (isValidData(number)) {
        std::cout << std::dec << number;
    }
    else {
        std::cout << "Invalid argument" << std::endl;
    }
}

void NumericCast::dec2hex()
{
    int32_t number;
    std::cin >> std::dec >> number;

    if (isValidData(number)) {
        std::cout << std::hex << number;
    }
    else {
        std::cout << "Invalid argument" << std::endl;
    }
}

void NumericCast::hex2oct()
{
    int32_t number;
    std::cin >> std::hex >> number;

    if (isValidData(number)) {
        std::cout << std::oct << number;
    }
    else {
        std::cout << "Invalid argument" << std::endl;
    }
}

void NumericCast::oct2hex()
{
    int32_t number;
    std::cin >> std::oct >> number;

    if (isValidData(number)) {
        std::cout << std::hex << number;
    }
    else {
        std::cout << "Invalid argument" << std::endl;
    }
}

void NumericCast::dec2oct()
{
    int32_t number;
    std::cin >> std::dec >> number;

    if (isValidData(number)) {
        std::cout << std::oct << number;
    }
    else {
        std::cout << "Invalid argument" << std::endl;
    }
}

void NumericCast::oct2dec()
{
    int32_t number;
    std::cin >> std::oct >> number;

    if (isValidData(number)) {
        std::cout << std::dec << number;
    }
    else {
        std::cout << "Invalid argument" << std::endl;
    }
}

bool NumericCast::isValidData(int32_t data)
{
    if (data < 1) {
        return false;
    }

    uint32_t max = (1 << 31);

    if (data > max-1) {
        return false;
    }

    return true;
}

main.cpp

#include "NumericCast.h"

int main(int argc, char** argv)
{
    auto numericCast = NumericCast::getInstance();
    
    numericCast->hex2dec();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值