David Jann

Projekte

Hier finden Sie aktuelle Projekte und Spielereien.

projects
exercises
rom_num.html
//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;
}