将整数转换为罗马数字
Converting integer to Roman Numeral
我有一个测试将在大约四个小时后到期,其中一个问题要求我们将用户输入的最多 100 的整数转换为罗马数字。我认为我的代码非常接近(我找到了一个 youtube 视频,我有点用作指南(,但唉,我的代码根本无法:(工作。任何人都可以发现错误吗?编辑:啊sry sry sry,问题是当它编译时,它没有给出罗马数字。就像我输入一个值一样,它给了我一个空白。
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
int main()
{
string romnum;
int input;
int num;
cout << "Type in an integer: ";
cin >> input;
if(( input >= 101) || (input <= 0)) // <-- this is the upper bound
{
cout << "n INVALID INPUT";
}
else
{
if(input = 100)
{
romnum + 'C';
}
input %= 100; // gets the remainder after dividing by 100
if(input <= 10)
{
num = (input/10); // now we are dealing with number in 10s place
if(num == 9)
{
romnum += "XC";
}
else if(num >= 5)
{
romnum += 'L';
for(int i=0; i < num - 5;i++)
{
romnum += 'X';
}
}
else if(num == 4)
{
romnum += "XL";
}
else if(num >= 1)
{
for(int i=0; i>num; i++)
{
romnum += 'X';
}
input %= 10;
}
if(num >= 1)
{
num = input; // now we are dealing with number in ones place
if(num == 9)
{
romnum += "IX";
}
else if(num >= 5)
{
romnum += 'V';
for(int i=0; i < num - 5; i++)
{
romnum += 'I';
}
}
else if(num == 4)
{
romnum += "IV";
}
else if(num >= 1)
{
for(int i = 0; i < num; i++)
{
romnum += 'I';
}
}
cout << "The Roman Numeral is: " << romnum;
}
}
cout << "The Roman Numeral is: " << romnum;
}
int f;
cin >> f;
return 0;
}
enter code here
来自 http://rosettacode.org/wiki/Roman_numerals/Encode#C.2B.2B
std::string to_roman(unsigned int value)
{
struct romandata_t { unsigned int value; char const* numeral; };
const struct romandata_t romandata[] =
{
{1000, "M"}, {900, "CM"},
{500, "D"}, {400, "CD"},
{100, "C"}, { 90, "XC"},
{ 50, "L"}, { 40, "XL"},
{ 10, "X"}, { 9, "IX"},
{ 5, "V"}, { 4, "IV"},
{ 1, "I"},
{ 0, NULL} // end marker
};
std::string result;
for (const romandata_t* current = romandata; current->value > 0; ++current)
{
while (value >= current->value)
{
result += current->numeral;
value -= current->value;
}
}
return result;
}
此代码会将整数(小于 3999(转换为罗马数字。
string int_to_roman(int a)
{
string ans;
string M[] = {"","M","MM","MMM"};
string C[] = {"","C","CC","CCC","CD","D","DC","DCC","DCCC","CM"};
string X[] = {"","X","XX","XXX","XL","L","LX","LXX","LXXX","XC"};
string I[] = {"","I","II","III","IV","V","VI","VII","VIII","IX"};
ans = M[a/1000]+C[(a%1000)/100]+X[(a%100)/10]+I[(a%10)];
return ans;
}
一个主要问题在这里:
if(input = 100)
我想你的意思是
if(input == 100)
如果您在调试器中单步执行代码,您会发现这很容易。请记住,调试器是程序员最好的朋友,也是在事情没有按预期工作时使用的第一个工具。
我认为这实际上可以比您的尝试更简单地解决,坦率地说,我不明白您要做什么(但这就是我(。
无论如何,它可以只是一个if/else的序列,甚至不是嵌套的。您需要做的就是检查输入数字中包含的"最大"文本是什么,记下它,然后从输入数字中减去 if 表示的值。以这种方式继续,直到达到 0。
例如(我不确定这是C++语法,但你当然可以调整它(:
string roman = ""
if(input == 100)
{
roman += "C";
input -= 100;
}
if(input >= 50)
{
roman += "L";
input -= 50;
}
依此类推,您可以自己解决其余的问题(毕竟这是您的测试(。
两件事:
- 有些文字可以重复(3:III,20:XX(。
- 例如,用"XXXX"写40而不是"XL"仍然是一个有效的罗马数字(尽管不太常见(,所以如果我评估你的测试,我会接受它,但这取决于作业。(http://en.wikipedia.org/wiki/Roman_numerals(
Joachim 发现了第一个问题,这段代码总是被执行并用 100 覆盖输入。
if(input = 100)
{
romnum + 'C';
}
现在,你为什么什么都看不到?那是因为你错过了另一个=
.所有其他代码都正确使用 +=
但这使用 +
.因此,这不会将生成的字符串重新分配给 romnum
。
顺便说一句,由于romnum
仍然是空的,您可以互换使用romnum = 'C'
或romnum += 'C'
。
我写这个是为了好玩;也许有用。但请注意,它不适用于大于 1000 的值。不过可以调整它以满足您的需求。给你:
enum roman_digits{
I=1,
V=5,
X=10,
L=50,
C=100,
D=500,
M=1000
};
std::string lookup(roman_digits v) {
switch (v) {
case I:
return "I";
case V:
return "V";
case X:
return "X";
case L:
return "L";
case C:
return "C";
case D:
return "D";
case M:
return "M";
default:
return NULL;
}
}
std::string to_roman(const int value) {
roman_digits weight[] = { I, V, X, L, C, D, M };
std::string result;
int t;
int i;
if (value == 0) {
return NULL;
} else {
unsigned int i;
for (i = 0; i < sizeof(weight) / sizeof(roman_digits); ++i) {
if (value == weight[i]) {
return lookup(weight[i]);
}
}
}
i = 0;
t = value;
while (t > 0) {
t = value;
t /= weight[i++];
}
--i;
int prev_wt_sub = i % 2 ? (i - 1) : (i - 2);
if ((weight[i] - weight[prev_wt_sub]) < value) {
result += lookup(weight[prev_wt_sub]) + lookup(weight[i]) +
to_roman(value - (weight[i] - weight[prev_wt_sub]));
} else if ((weight[i] - weight[prev_wt_sub]) > value) {
prev_wt_sub += (value / weight[prev_wt_sub + 1] ? 1 : 0);
result += lookup(weight[prev_wt_sub]) +
to_roman(value - weight[prev_wt_sub]);
} else {
result += lookup(weight[prev_wt_sub]) + lookup(weight[i]);
}
return result;
}
//java code
进口 java.io.*;
公共类 NumberToRoman {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Enter any number");
int num= Integer.parseInt(br.readLine());
NumberToRoman n = new NumberToRoman();
n.conversion(num);
}
public void conversion(int y) {
int i=0;
int decimal[] = {1000,900,500,400,100,90,50,10,9,5,4,1};
String roman[]= {"M","CM","D","CD","C","XC","L","X","IX","V","IV","I"};
while(y!=0) {
while(y/decimal[i]!=0) {
System.out.print(roman[i]);
y=y-decimal[i];
}
i++;
}
}
}
十进制转换为罗马数字的函数字符串到LongRoman(int x( {
string Romanvalue;
string Roman[13] = { "M","CM","D","CD", "C","XC", "L","XL", "X","IX","V","IV", "I" };
int Numbers[13] = { 1000, 900, 500,400, 100,90,50,40,10,9,5,4,1 };
for (int index = 0; index < 13; index++) {
while (x >= Numbers[index]) {
Romanvalue += Roman[index];
x -= Numbers[index];
}
}
return Romanvalue;
这是我的解决方案。有点蛮力,可以重构,但实际上运行得非常快并且易于调试(第一次尝试完美运行(。它确实有嵌套的 ifs,因此如果没有 10,您永远不会检查 100、1000 等。
string intToRoman(int num) {
string retVal="";
int ones=num%10;
cout<<ones<<endl;
int onesRest=(num-ones)/10;
switch (ones){
case 1:
retVal="I";
break;
case 2:
retVal="II";
break;
case 3:
retVal="III";
break;
case 4:
retVal="IV";
break;
case 5:
retVal="V";
break;
case 6:
retVal="VI";
break;
case 7:
retVal="VII";
break;
case 8:
retVal="VIII";
break;
case 9:
retVal="IX";
break;
}
if(onesRest>0){
int tens=onesRest%10;
int tensRest=(onesRest-tens)/10;
switch (tens){
case 1:
retVal="X"+retVal;
break;
case 2:
retVal="XX"+retVal;
break;
case 3:
retVal="XXX"+retVal;
break;
case 4:
retVal="XL"+retVal;
break;
case 5:
retVal="L"+retVal;
break;
case 6:
retVal="LX"+retVal;
break;
case 7:
retVal="LXX"+retVal;
break;
case 8:
retVal="LXXX"+retVal;
break;
case 9:
retVal="XC"+retVal;
break;
}
if(tensRest>0){
int hundreds=tensRest%10;
int hundredsRest=(tensRest-hundreds)/10;
switch (hundreds){
case 1:
retVal="C"+retVal;
break;
case 2:
retVal="CC"+retVal;
break;
case 3:
retVal="CCC"+retVal;
break;
case 4:
retVal="CD"+retVal;
break;
case 5:
retVal="D"+retVal;
break;
case 6:
retVal="DC"+retVal;
break;
case 7:
retVal="DCC"+retVal;
break;
case 8:
retVal="DCCC"+retVal;
break;
case 9:
retVal="CM"+retVal;
break;
}
if(hundredsRest>0){
int thousands=hundredsRest%10;
switch (thousands){
case 1:
retVal="M"+retVal;
break;
case 2:
retVal="MM"+retVal;
break;
case 3:
retVal="MMM"+retVal;
break;
}
}
}
}
return retVal;
}
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何用数字处理log(0)
- 最高有效数字侧的第N位
- 如何获取一个数字的前3位
- 查找最接近的大于当前数字的数字的索引
- 找到两对数字,使它们的乘积的绝对差最小化
- 我想做一个彼此不同但重复出现的数字
- 将数字转换为字母(例如:123 转换为一二三)
- C++如何计算用户输入的数字中的偶数位数
- 如何在C++中确定文本文件中的元素是字符还是数字
- 打印数字图案
- C++问题:用户认为数字1-100,程序提出问题不超过6次即可得到答案。无法正确
- 如何检查一个c++字符串中有多少相同的字符/数字
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 将数字打印成文字
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 在将数字随机生成为数组期间从内存输出随机数的数组