C - konwersja rzymski - piątkowy

C - konwersja rzymski - piątkowy
0

Witam, usiłuję zrobić program do konwersji z systemu rzymskiego na piątkowy, zrobiłem konwersję z rzymskiego na arabskie, ale nie wiem co dalej. Myślałem żeby otrzymany wynik w arabskich podzielić modulo 5 i kolejne reszty dzielenia zapisywać do jakiejś tablicy po czym odczytać tablicę w odwrotnej kolejności, ale nie wiem jak sie za to zabrac.

Kod prog.

Kopiuj
 #include <stdio.h>
#include "stdafx.h"

#define ROZM 100

int liczba(char c){
if(c=='I'){
 return 1;
}
if(c=='V'){
 return 5;
}
if(c=='X'){
 return 10;
}
if(c=='L'){
 return 50;
}
if(c=='C'){
 return 100;
}
if(c=='D'){
 return 500;
}
if(c=='M'){
 return 1000;
}
if(c==0){
 return 0;
}
return -1;
}

int main(){
char rzymski[ROZM];
int i;
for(i=0;i<ROZM;i++){
 rzymski[i]=0;
}
printf("Wpisz rzymska liczbe\n");
scanf("%s",&rzymski);
int tmp=0, wynik=0, a=0;
i=0;
while(rzymski[i]!=0){
 a=liczba(rzymski[i]);
 tmp=liczba(rzymski[i+1]);
 if(a==-1){
  printf("LICZBA JEST NIEPOPRAWNA!!\n");
  break;
 }
 if(a>=tmp){
  wynik=wynik+a;
 }
 else{
  wynik=wynik+(tmp-a);
  i++;
 }
 i++;
}
printf("%d\n",wynik);
printf("wcisnij dowolny klawisz...\n");
scanf("%d",wynik);
}
PO
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 3 lata
  • Postów:211
0

pomysł dobry. Ten kod raczej poprawnie przelicza z 10 na każdy inny system o podstawie od 2 do 10. Zmienna podstawy w kodzie to 'p'

Kopiuj
 #include <iostream>
#include <string>

using namespace std;

int main(){
	string s;
	unsigned c,L,p;
	char z[1];

	cin >> L;// wczytaj liczbe system 10;
	p=5; // bo system 5 mozna kazdy inny od 2 do 10

	cout << "\n" << L << "(10) = ";

	do {
		c = L % p;
		s = char(c + '0') + s;
		L = L / p;
	} while(L != 0);

	cout << s << "(" << p << ")" << endl;

	return 0;
} 
edytowany 1x, ostatnio: porschelukas
ZJ
Czyli jak rozwiązać problem o złożoności liniowej sposobem o złożoności kwadratowej. Ale jeżeli nie używa się liczb o dowolnej precyzji to nawet może być (jak nie jest zbyt często w programie wykorzystywane).
PO
być może ten kod nie jest jakoś bardzo optymalny, ale działa chyba w czasie liniowym wg mnie;) raz kręcę pętlą od początku do końca wczytanej liczby, a później wypisuje łańcuch znaków. do while jest raczej liniowy, a samo wypisywanie stringa też ma pewnie złożoność liniową względem długości. No chyba, że chodzi o dopisywanie do stringa kolejnych znaków... nie wiem dokładnie jak to działa, jeśli robi za każdym razem nową tablicę charów i kopiuje to z poprzedniej to faktycznie kiepska złożoność
ZJ
Dodawanie znaku na początku stringa jest liniowe od jego długości ponieważ trzeba co najmniej skopiować wszystkie znaki o jedno miejsce (jak jest na nie miejsce zaalokowane z zapasem). Nie wiem, czy jest jakaś optymalizacja na dodawanie pojedynczych znaków na koniec.
PO
czyli lepsza byłaby zwykła tablica charów odpowiedniej długości ewentualnie intów?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.