[c++]z arabskich na rzymskie ?

0

da sie jakos ten kod przerobiic zeby wyswietlal z arabskich na rzymskie


int RzNaAr(char *Liczba)
#define I  1;
#define V  5;
#define X  10;
#define L  50;
#define C  100;
#define D  500;
#define M  1000;
{
  int Najw = 0;
  int j;
  int Cyfra;
  int Suma = 0;
  for (j = strlen(Liczba)-1; j>=0; j--)
  {
    Liczba[j] = Liczba[j] & 0xDF;
/*Nie wiem jaka funkcja zminia na duże znaki, więc assembler i układ kodów ASCII przychodzi z pomocą */
    switch (Liczba[j])
    {
    case 'I': Cyfra = I;break;
    case 'V': Cyfra = V;break;
    case 'X': Cyfra = X;break;
    case 'L': Cyfra = L;break;
    case 'C': Cyfra = C;break;
    case 'D': Cyfra = D;break;
    case 'M': Cyfra = M;break;
    };

   if (Cyfra >= Najw)
   {
     Najw = Cyfra;
     Suma = Suma + Najw;
   }
   else
     Suma = Suma - Cyfra;
  }
  return Suma;
};

Prosze o pomoc

0

Dawno temu naskrobane.

/* Arabskie na Rzymskie */
void ArNaRz(int LAr, char *LRzym)
{
  int Poz=0, Liczba;

  Liczba = LAr;

  while (Liczba >= 1000)
  {
    LRzym[Poz++] = 'M';
    Liczba -= M;
  }
  while (Liczba + 100>=1000)
  {
    LRzym[Poz++] = 'C'; LRzym[Poz++] = 'M';
    Liczba -= 900;
  }
  while (Liczba >= 500)
  {
    LRzym[Poz++] = 'D';
    Liczba -= D;
  }
  while (Liczba + 100>=500)
  {
    LRzym[Poz++] = 'C'; LRzym[Poz++] = 'D';
    Liczba -= 400;
  }
  while (Liczba >= 100)
  {
    LRzym[Poz++] = 'C';
    Liczba -= C;
  }
  while (Liczba + 10>=100)
  {
    LRzym[Poz++] = 'X'; LRzym[Poz++] = 'C';
    Liczba -= 90;
  }
  while (Liczba >= 50)
  {
    LRzym[Poz++] = 'L';
    Liczba -= L;
  }
  while (Liczba + 10>=50)
  {
    LRzym[Poz++] = 'X'; LRzym[Poz++] = 'L';
    Liczba -= 40;
  }
  while (Liczba >= 10)
  {
    LRzym[Poz++] = 'X';
    Liczba -= X;
  }
  while (Liczba + 1>=10)
  {
    LRzym[Poz++] = 'I'; LRzym[Poz++] = 'X';
    Liczba -= 9;
  }
  while (Liczba >= 1)
  {
    LRzym[Poz++] = 'I';
    Liczba -= I;
  }
  LRzym[Poz] = '\0';
}
0

wkleilem to w cpp i nie dziala wyskakuje ze nie zdefinowano M ???

mam taki kod z php a moze da sie z tego latwo przerobic ???


if(isset($num)) {
		$ok = true;
		if(strlen($num)>5) 
		{
				print("<br><br><b>Liczba za du&#380;a!</b><br>");
				$ok = false;
		}
		else {
			for($i = 0; $i<strlen($num);  $i++)
			{
				if(!($num[$i]>='0' && $num[$i]<='9')) { 
						print "<br><br><b>Nieprawid&#322;owa liczba! (nie jest cyfr&#261;)</b><br>";
						$ok = false;
						break;
				}
			}
			if($num>3000) {
				print("<br><br><b>Liczba za du&#380;a!</b><br>");
				$ok = false;
			}
		}
		if($ok) {
			$araba = array(1,4,5,9,10,40,50,90,100,400,500,900,1000); 
			$roma = array("I","IV","V","IX","X","XL","L","XC","C","CD","D","CM","M");
			$i = 12;
			$romstr = "";
			while ((integer)$num) { 
				while ((integer)$num >= $araba[$i]) { 
						(integer)$num -= $araba[$i]; 
						$romstr.=$roma[$i];
				} 
				$i--; 
			} 
		}
		print("<br>Liczba rzymska = $romstr<br>");
	}

0

a juz czaje zdefiniowalem M w DEFINE
ale jak wpisze liczbe
7 to wyswietla : IIIIIII :( a nie VII

0

a juz czaje zdefiniowalem M w DEFINE
ale jak wpisze liczbe
7 to wyswietla : IIIIIII :( a nie VII

Tak to jest, jak sie wycina z wiekszego pliku :P

#include <stdio.h>
#define I 1;
#define V 5;
#define X 10;
#define L 50;
#define C 100;
#define D 500;
#define M 1000;
/* Arabskie na Rzymskie */
void ArNaRz(int LAr, char *LRzym) {
  int Poz=0, Liczba;

  Liczba = LAr;
  while (Liczba >= 1000) {
    LRzym[Poz++] = 'M';
    Liczba -= M;
  }
  while (Liczba + 100>=1000) {
    LRzym[Poz++] = 'C'; LRzym[Poz++] = 'M';
    Liczba -= 900;
  }
  while (Liczba >= 500) {
    LRzym[Poz++] = 'D';
    Liczba -= D;
  }
  while (Liczba + 100>=500)
  {
    LRzym[Poz++] = 'C'; LRzym[Poz++] = 'D';
    Liczba -= 400;
  }
  while (Liczba >= 100) {
    LRzym[Poz++] = 'C';
    Liczba -= C;
  }
  while (Liczba + 10>=100) {
    LRzym[Poz++] = 'X'; LRzym[Poz++] = 'C';
    Liczba -= 90;
  }
  while (Liczba >= 50) {
    LRzym[Poz++] = 'L';
    Liczba -= L;
  }
  while (Liczba + 10>=50) {
    LRzym[Poz++] = 'X'; LRzym[Poz++] = 'L';
    Liczba -= 40;
  }
  while (Liczba >= 10) {
    LRzym[Poz++] = 'X';
    Liczba -= X;
  }
  while (Liczba + 1>=10) {
    LRzym[Poz++] = 'I'; LRzym[Poz++] = 'X';
    Liczba -= 9;
  }
  while (Liczba >= 5) {
    LRzym[Poz++] = 'V';
    Liczba -= V;
  }
  while (Liczba + 1>=5) {
    LRzym[Poz++] = 'I'; LRzym[Poz++] = 'V';
    Liczba -= 4;
  }
  while (Liczba >= 1) {
    LRzym[Poz++] = 'I';
    Liczba -= I;
  }
  LRzym[Poz] = '\0';
}
0
#include <stdio.h>
#include <stdlib.h>

// funkcja zwraca dlugosc ciagu rzymskich cyfr dlapodanej liczby
int rlen(unsigned a){
  if(a>3999)return -1; // out of range ;]
  int i=0;
  int dlugosci[]={0,1,2,3,2,1,2,3,4,2};
  while(a){
    i+=dlugosci[a%10];
    a/=10;
  }
  return i;
} 

// konwersja
char* a2r(char* s,unsigned a){
  if(a>3999)return "out of range";
  char* cyfry="IVXLCDM"; // dopisz kilka, to zwiekszysz zakres ponad 3999
  char* wzorce[]={"","0","00","000","01","1","10","100","1000","02"};
  int dlugosci[]={0,1,2,3,2,1,2,3,4,2}; // mozna strlen(wzorce[...]), ale tak szybciej
  unsigned i=a,j=0;
  while(a){
    j+=dlugosci[a%10];
    a/=10;
  }
  while(i){
    int b;
    int k=dlugosci[b=(i%10)];
    while(k--)s[--j]=cyfry[(wzorce[b][k]&0x0f)+a];
    a+=2;
    i/=10;
  }
  return s;
}

main(){
  unsigned a=1478;
  int l=rlen(a);
  char *s=(char*)malloc(l+1);
  printf("liczba: %d ; dlugosc liczby w zapisie rzymskim: %d ; reprezentacja: %s\n",l,a2r(s,a));
  free(s);
  return 0;
}

// wystarczy porzadnie przygotować dane, a samo sie liczy ;p

0

Tu masz 10x krótszy kod w JavaScript - a że składnia jest prawie taka sama jak w C to może nie będzie większych problemów z implementacją.
http://www.marooned.neostrada.pl/4prog/iglu.htm (zajrzyj w źródło)

1 użytkowników online, w tym zalogowanych: 0, gości: 1