Сумма чисел, записанных в римской системе счисления - 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.

  1. 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 выводит результат на экран.
  2. Функция proc принимает три параметра: p (строка, представляющая число в римской системе счисления), n (текущее значение числа) и flag (флаг, который равен 1, если число уже найдено, и 0 в противном случае). Сначала функция разбивает число на разряды (сотни, десятки, единицы) и сохраняет их в отдельные переменные x1000, x100, x10 и x1. Затем она использует вложенные switch для преобразования каждого разряда в римскую систему счисления и добавления соответствующего значения к строке c. В конце функция проверяет, совпадает ли p с c. Если да, то функция возвращает 1, иначе 0.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.167 из 5
Похожие ответы