gpt4 book ai didi

c++ - 罗马转十进制

转载 作者:太空狗 更新时间:2023-10-29 20:06:58 25 4
gpt4 key购买 nike

您如何看待这段代码?这是最好的方法吗?有什么改进吗?

罗马.h

#ifndef ROMAN_H
#define ROMAN_H

#include <string>

#include <map>

typedef unsigned long int UL_I;
typedef std::map< std::string, UL_I, std::less< std::string > > Map;

class Roman_Number
{
public:
//Constructor
Roman_Number( std::string );

void Convert_to_decimal();

UL_I get_Decimal() const;
std::string get_Roman() const;

private:
std::string s_roman_number;
UL_I d_number;

Map pairs;
Map pairs_substracting;

//Utilitaries functions
void _validate_();
void _initilize_pairs_()
{
pairs.insert( Map::value_type( "I", 1 ) );
pairs_substracting.insert( Map::value_type ( "IV", 4 ) );
pairs.insert( Map::value_type( "V", 5 ) );
pairs_substracting.insert( Map::value_type( "IX", 9 ) );
pairs.insert( Map::value_type( "X", 10 ) );
pairs_substracting.insert( Map::value_type( "XL", 40 ) );
pairs.insert( Map::value_type( "L", 50 ) );
pairs_substracting.insert( Map::value_type( "XC", 90 ) );
pairs.insert( Map::value_type( "C", 100 ) );
pairs_substracting.insert( Map::value_type( "CD", 400 ) );
pairs.insert( Map::value_type( "D", 500 ) );
pairs_substracting.insert( Map::value_type( "CM", 900 ) );
}
UL_I _recursive_convert( std::string );
};

#endif

罗马.cpp

#include <iostream>

#include "Roman.h"

void Roman_Number::_validate_()
{
std::cout << "Validating" << std::endl;

}

Roman_Number::Roman_Number(std::string r_number )
{
_initilize_pairs_();
s_roman_number = r_number;
d_number = 0;
}

void Roman_Number::Convert_to_decimal()
{
std::string s_aux = s_roman_number;
d_number = _recursive_convert( s_aux );
}

UL_I Roman_Number::_recursive_convert( std::string new_roman )
{
if( new_roman == "" )
return 0;
if( pairs_substracting.find( new_roman.substr( 0 , 2 ) ) != pairs_substracting.end() )
return pairs_substracting[new_roman.substr( 0, 2 )] +
_recursive_convert( new_roman.erase( 0, 2) );
else
return pairs[new_roman.substr( 0, 1 )] + _recursive_convert( new_roman.erase( 0, 1 ) );
}

UL_I Roman_Number::get_Decimal() const
{
return d_number;
}

std::string Roman_Number::get_Roman() const
{
return s_roman_number;
}

主要.cpp

#include <iostream>

#include "Roman.h"

int main() {
Roman_Number R_N( "XIL" );
R_N.Convert_to_decimal();
std::cout << R_N.get_Decimal();
return 0;
}

最佳答案

这个怎么样? http://codepad.org/mJ05BldC

#include <stdio.h>

int main( void ) {
const char* s = "MCDXLIV";
int x = 0; // result

int j,m=0; // max used digit
const char* p=s, *q; while(*p) ++p;
for( --p; p>=s; p-- ) for( q="IVXLCDM",j=0; *q; q++,j++ ) if( *p==*q )
x += ((j>=m)?m=j,1:-1) * (1+j%4/2*9) * (1+j/4*99) * (1+j%2*4);

printf( "s=%s x=%i\n", s, x );
}

关于c++ - 罗马转十进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5254934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com