David Jann
Projekte
Hier finden Sie aktuelle Projekte und Spielereien.
projects
//decimal to roman numbers
#include<iostream>
#include<cmath> //pow
#include<string>
//Translating Rules for 1 - 3999
/*
min max
1 -> I I - III
5 -> V IV - VIII
10 -> X IX - XVIII
50 -> L XL - LXXX
100 -> C XC - CLXXX
500 -> D CD - DCCC
1000 -> M CM - MDCCC
*/
int main() {
//Variable
int cnt_arr; //Counter for Array - Inserts
int cnt_rom; //Amount of similar Roman Numbers
int rom_div = 4; //Selector for "rom_arr"; Size: due to amount Roman Power (^10) Numbers
int rom_len = rom_div - 1; //Iterator for Power
std::string rom_scr = ""; //Collects Roman Numbers
std::string rom_arr[2 * rom_div - 1] = //Roman Numbers Array;
{"I", "X", "C", "M", //^10 //if insert more Roman Numbers:
"V", "L", "D"}; //^10*5 //Change "rom_div"
int dec_num; //Input Decimal Number
int dec_pow; //Power of 10th
int dec_arr[rom_div]; //Array for splitted Decimal Number
bool dec_in = false; //Check for Input: 1 to 3999
//Input
do {
std::cout << "Input a number: ";
std::cin >> dec_num;
if (dec_num > 0 && dec_num < 4000) {
dec_in = true;
} else {
std::cout << std::endl << "Please between 1 and 3999." << std::endl;
}
} while (!dec_in);
//Translator Number => Array (biggest Number has latest Array - Position)
for (int i = rom_len; i >= 0; i--) {
dec_pow = std::pow(10, i);
dec_arr[i] = dec_num / dec_pow; //Datatype (Int) => Cut
dec_num = dec_num % dec_pow;
}
//Translator Array => Roman Number
for (int i = rom_len; i >= 0; i--) {
cnt_rom = dec_arr[i];
if (cnt_rom <= 3) {
//nothing
} else if (cnt_rom == 4) {
//special insert: roman number & 5x higher roman number
cnt_rom = 0;
rom_scr += rom_arr[i] + rom_arr[i + rom_div];
}else if (cnt_rom <= 8) {
//minus 5 /special insert: 5x higher roman number
cnt_rom -= 5;
rom_scr += rom_arr[i + rom_div];
} else {
//special insert: roman number & higher power roman number
cnt_rom = 0;
rom_scr += rom_arr[i] + rom_arr[i + 1];
}
for (int j = 1; j <= cnt_rom; j++) {
rom_scr += rom_arr[i];
}
}
//Output
std::cout <<std::endl << "For the decimal number '";
//decimal numbers
for (int i = rom_len; i >= 0; i--) {
//!= 0 => print
if (dec_arr[i]) {
std::cout << dec_arr[i];
} else {
for (int j = i; j <= rom_len; j++) {
//print non-leading zeros
if (dec_arr[j]) {
std::cout << dec_arr[i];
break;
}
}
}
}
std::cout << "', the roman number is: ";
//roman numbers
std::cout << rom_scr;
return 0;
}