Сумма чисел, записанных в римской системе счисления - C (СИ)
Формулировка задачи:
Здравствуйте. Нужно посчитать сумму двух натуральных чисел A и B, записанных в римской системе счисления. Ответ также записать в римской системе счисления. (считывать в две строчки а и б).
M = 1000
D = 500
C = 100
L = 50
X = 10
V = 5
I = 1
Все числа не превышают 2000
Код из других тем с решением пока не понимаю, так что лучше на самом базовом Си
Решение задачи: «Сумма чисел, записанных в римской системе счисления»
textual
Листинг программы
#include<stdio.h>
#include<string.h>
int proc(char p[], int n,int flag);
int main(void)
{
int i=0,j,x1,x2;
char s1[50],s2[50];
scanf("%s",s1);
scanf("%s",s2);
for(i=1;i<2000;i++)
if(proc(s1,i,0))
{ x1=i; break;}
for(i=1;i<2000;i++)
if(proc(s2,i,0))
{ x2=i;break;}
proc(s2,x1+x2,1);
return 0;
}
int proc(char p[],int n,int flag)
{
char c[30]="";
int x1,x10,x100,x1000;
x1=n%10; n/=10;
x10=n%10; n/=10;
x100=n%10; n/=10;
x1000=n%10;
switch(x1000)
{
case 1: strcat(c,"M"); break;
case 2: strcat(c,"MM"); break;
case 3: strcat(c,"MMM"); break;
}
switch(x100)
{
case 1: strcat(c,"C"); break;
case 2: strcat(c,"CC"); break;
case 3: strcat(c,"CCC"); break;
case 4: strcat(c,"CD"); break;
case 5: strcat(c,"D"); break;
case 6: strcat(c,"DC"); break;
case 7: strcat(c,"DCC"); break;
case 8: strcat(c,"DCCC"); break;
case 9: strcat(c,"CM"); break;
}
switch(x10)
{
case 1: strcat(c,"X"); break;
case 2: strcat(c,"XX"); break;
case 3: strcat(c,"XXX"); break;
case 4: strcat(c,"XL"); break;
case 5: strcat(c,"L"); break;
case 6: strcat(c,"LX"); break;
case 7: strcat(c,"LXX"); break;
case 8: strcat(c,"LXXX"); break;
case 9: strcat(c,"XC"); break;
}
switch(x1)
{
case 1: strcat(c,"I"); break;
case 2: strcat(c,"II"); break;
case 3: strcat(c,"III"); break;
case 4: strcat(c,"IV"); break;
case 5: strcat(c,"V"); break;
case 6: strcat(c,"VI"); break;
case 7: strcat(c,"VII"); break;
case 8: strcat(c,"VIII"); break;
case 9: strcat(c,"IX"); break;
}
if(flag)
printf("%s\n",c);
if(!strcmp(p,c))
return 1;
else
return 0;
}
Объяснение кода листинга программы
Код представлен в виде двух функций: main и proc.
mainначинается с инициализации переменныхi,j,x1,x2и массивовs1иs2. Затем происходит чтение двух строк с помощьюscanfи сохранение их вs1иs2. Затем следует два вложенных циклаfor, которые проходят по всем числам от 1 до 2000. Они ищут числа, которые можно записать в римской системе счисления, используя функциюproc. Если число найдено, то оно сохраняется в соответствующую переменнуюx1илиx2, и циклы прерываются. После этого вызывается функцияprocс суммойx1+x2и флаг1. Эта функция преобразует число в римскую систему счисления и сохраняет результат в строкуc. Затем она проверяет, совпадает ли входная строкаpсc. Если да, то функция возвращает1, иначе0. В концеmainвыводит результат на экран.- Функция
procпринимает три параметра:p(строка, представляющая число в римской системе счисления),n(текущее значение числа) иflag(флаг, который равен1, если число уже найдено, и0в противном случае). Сначала функция разбивает число на разряды (сотни, десятки, единицы) и сохраняет их в отдельные переменныеx1000,x100,x10иx1. Затем она использует вложенныеswitchдля преобразования каждого разряда в римскую систему счисления и добавления соответствующего значения к строкеc. В конце функция проверяет, совпадает лиpсc. Если да, то функция возвращает1, иначе0.