/*
Arapski broj u rimski broj.
http://www.periodni.com/hr/pretvaranje_rimskih_brojeva.html
https://bs.wikipedia.org/wiki/Rimski_brojevi
http://www.mef.unizg.hr/~mtaradi/nastava/ostalo/preracun/skripte/rim_arap.htm
http://gwydir.demon.co.uk/jo/numbers/roman/index.htm
https://www.google.rs/search?q=convert+to+roman+numerals+c+code&gws_rd=cr&ei=m8OWWc6FFsjeUYvmjfAE
https://stackoverflow.com/questions/23269143/c-program-that-converts-numbers-to-roman-numerals
https://www.google.rs/search?q=algoritam+za+arapski+u+rimski+broj&rlz=1C1VFKB_enRS696RS704&oq=algoritam+za+arapski+u+rimski+broj&aqs=chrome..69i57.7216j0j7&sourceid=chrome&ie=UTF-8
Napisati funkciju koja za uneti arapski broj prikazuje odgovarajuci rimski broj.
Podsecanja radi, nize su date tabele sa rimskim ciframa:
I V X L C D M
1 5 10 50 100 500 1000
IV IX XL XC CD CM
4 9 40 90 400 900
Testni primer:
2736 = MMDCCXXXVI
tj. razdvojeno:
2 7 3 6
2736 = MM DCC XXX VI
3 4 4 4
3444 = MMM CD XL IV
3 9 9 9
3999 = MMM CM XC IX
MDCCCLXXXVIII = 1000 + 500 + 100 + 100 + 100 + 50 + 10 + 10 + 10 + 5 + 1 + 1 + 1 = 1888
Ako je vrijednost lijeve znamenke manja od desne,
onda se vrijednost lijeve znamenke oduzima od vrijednosti desne.
MCMXCIX = M CM XC IX or 1000 + (1000 - 100) + (100 - 10) + (10 - 1) = 1999
MCMXCIX = M CM XC IX or 1000 - 100 + 1000 - 10 + 100 - 1 + 10 = 1999
I V X L C D M
1 5 10 50 100 500 1000
Cifra hiljada: broj M-ova na pocetku * 1000 je broj hiljada.
0 1000 2000 3000 4000 5000 ... 11000
0 1 2 3 4 5 ... 11
M MM MMM MMMM MMMMM MMMMMMMMMMM
Cifra stotina: <4 , =4 , >4
0 100 200 300 400 500 600 700 800 900
0 1 2 3 4 5 6 7 8 9
C CC CCC CD D DC DCC DCCC CM
Cifra desetica: <4 , =4 , >4
0 10 20 30 40 50 60 70 80 90
0 1 2 3 4 5 6 7 8 9
X XX XXX XL L LX LXX LXXX XC
Cifra jedinica: <4 , =4 , >4
0 1 2 3 4 5 6 7 8 9
I II III IV V VI VII VIII IX
*/
#include <stdio.h>
#include <string.h>
// 1. nacin
void dopuniHiljade(char rimski[], int broj) {
char hiljade[100];
int i;
for (i = 0; i < broj; i++) {
hiljade[i] = 'M';
}
hiljade[i] = '\0';
strcat(rimski, hiljade);
}
void dopuniStotine(char rimski[], int broj) {
char stotine[100];
int i, j = 1;
if (broj < 4) {
for (i = 0; i < broj; i++) {
stotine[i] = 'C';
}
stotine[i] = '\0';
} else if (broj == 4) {
strcpy(stotine, "CD");
} else if (broj > 4 && broj < 9) {
stotine[0] = 'D';
for (i = 5; i < broj; i++) {
stotine[j++] = 'C';
}
stotine[j] = '\0';
} else {
strcpy(stotine, "CM");
}
strcat(rimski, stotine);
}
void dopuniDesetice(char rimski[], int broj) {
char desetice[100];
int i, j = 1;
if (broj < 4) {
for (i = 0; i < broj; i++) {
desetice[i] = 'X';
}
desetice[i] = '\0';
} else if (broj == 4) {
strcpy(desetice, "XL");
} else if (broj > 4 && broj < 9) {
desetice[0] = 'L';
for (i = 5; i < broj; i++) {
desetice[j++] = 'X';
}
desetice[j] = '\0';
} else {
strcpy(desetice, "XC");
}
strcat(rimski, desetice);
}
void dopuniJedinice(char rimski[], int broj) {
char desetice[100];
int i, j = 1;
if (broj < 4) {
for (i = 0; i < broj; i++) {
desetice[i] = 'I';
}
desetice[i] = '\0';
} else if (broj == 4) {
strcpy(desetice, "IV");
} else if (broj > 4 && broj < 9) {
desetice[0] = 'V';
for (i = 5; i < broj; i++) {
desetice[j++] = 'I';
}
desetice[j] = '\0';
} else {
strcpy(desetice, "IX");
}
strcat(rimski, desetice);
}
void dopuniRimski(char rimski[], int broj, int i) {
switch (i) {
case 0: dopuniHiljade(rimski, broj);
break;
case 1: dopuniStotine(rimski, broj);
break;
case 2: dopuniDesetice(rimski, broj);
break;
case 3: dopuniJedinice(rimski, broj);
break;
default:
break;
}
}
void pretvoriArapskiURimski(int arapski, char rimski[]) {
int n = 1000, broj, i = 0;
strcpy(rimski, "");
while (i < 4) {
broj = arapski / n;
if (broj != 0) {
dopuniRimski(rimski, broj, i);
}
i++;
arapski = arapski % n;
n = n / 10;
}
}
// 2. nacin (bolji)
void arapski2rimski(int arapski, char *rimski){
// Vrednosti rimskih cifri
int vrednost[] = {1000,900,500,400,100,90,50,40,10,9,5,4,1};
// Simboli rimskih cifri
char* simbol[]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
int i = 0;
strcpy(rimski,""); // praznimo string rimski
while (arapski){ // dok je arapski broj razlicit od nule
while (arapski/vrednost[i]){ // dok arapski sadrzi najvecu mogucu vrednost rimskih cifri
strcat(rimski, simbol[i]); // dodajemo simbol za tu vrednost stringu rimski
arapski -= vrednost[i]; // smanjujemo arapski broj za vrednost dodate rimske cifre
}
i++; // prelazimo na sledecu vrednost rimske cifre
}
}
int main(void) {
//int arapski=11000;
int arapski=2736;
char rimski[100];
printf("\n Arapski u rimski \n");
pretvoriArapskiURimski(arapski,rimski);
printf("\n %d = %s \n",arapski,rimski);
arapski2rimski(arapski,rimski);
printf("\n %d = %s \n",arapski,rimski);
return 0;
}