Public feed #722038

Anonymous

public text v1 · immutable
Raw Edit
·published 2007-10-01 18:36 UTC
rendered paste body
Привет! =)Теперь твоя очередь мне помогать =)) Я забыла прогу  и мне надо ее вспомнить. У нас такое задание - сделать перевод из десятичной в римскую систему исчисления. То есть пользователь вводит десятичное число, а ему на выходе выдают римскую форму записи. Я понимаю как это сделать только с многочисленными if-ами, но это очень долго и нудно. Вопрос в том, как это сделать по крутому. Язык программирования - С (не С++). Можешь отправить программу с комментариями плз на почту: profcorny@inbox.ru. Желательно сегодня. Заранее спасибо =))

//Тот, кто по-настоящему любит одного человека, любит весь мир

#include <stdio.h>

int main()
{
	printf("Вас приветствует Мозоль:\n\tпрограмма для перевода из римской системы счисления\n\tв десятичную, как это ни странно\n");
	printf("Введите число в десятичной системе счисления: ");
	int Number = 0;
	scanf("%d", &Number);
	
	//Это константы, определяющие размеры для букавок M, D, C, L, X и V
	const int MSize = 1000, DSize = 500, CSize = 100, LSize = 50, XSize = 10, VSize = 5;
	//Это сколько каких римских букавок у нас в конце-концов получится
	int MCount = 0, DCount = 0, CCount = 0, LCount = 0, XCount = 0, VCount = 0;
	
	while (Number >= MSize) { ++MCount; Number -= MSize; }
	while (Number >= DSize) { ++DCount; Number -= DSize; }
	while (Number >= CSize) { ++CCount; Number -= CSize; }
	while (Number >= LSize) { ++LCount; Number -= LSize; }
	while (Number >= XSize) { ++XCount; Number -= XSize; }
	while (Number >= VSize) { ++VCount; Number -= VSize; }
	//Это мы только что разобрались, сколько в римской системе счисление каких букавок.
	
	//Теперь осталось решить только 1 проблему. Как известно 9 = IX, т.е. I будет стоять перед X
	//в некоторых случаях
	
	//Таких кривых чисел всего 2: 4 = IV и 9 = IX. Ну, надо эти случаи обработать
	
	printf("А вот и ваше число, мусье или модам: ");
	while (MCount > 0) { printf("M"); --MCount; }
	while (DCount > 0) { printf("D"); --DCount; }
	while (CCount > 0) { printf("C"); --CCount; }
	while (LCount > 0) { printf("L"); --LCount; }
	while (XCount > 0) { printf("X"); --XCount; }
	
	//Тупо вывели те букавки, в которых у нас нет сомнений, в нужном количестве
	//Теперь обрабатываем наш нереально сложный случай
	
	if (Number == 4) {
		printf("I"); 
		if (VCount > 0) printf("X");
		else            printf("V");
	}
	
	//Если это и не 4 и не 4+5=9, то тогда выводим пятерочку, представленную букавкой V
	//Понятно, что пятерка на конце может быть только одна
	else { 
		if (VCount > 0) printf("V"); 
		while (Number > 0) { printf("I"); --Number; }
	} 

	return 0;	
}