描述
写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。
数据范围:保证结果在 1≤n≤2^31−1
输入描述:
输入一个十六进制的数值字符串。
输出描述:
输出该数值的十进制字符串。不同组的测试用例用\n隔开。
示例1
輸入:0xAA
輸出:170
思路
- 使用單例模式
- 對於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();
}