Тема: "Переведення чисел із арабської системи числення в Римську"

Хочу попросити поради. Написала такий код для реалізації цього завдання( мова С ):
Чи можна якось змінити код, щоб виглядав лаконічніше та зменшити, або може потрібно чи краще застосувати масиви? я новачок в сі, тому прошу вашої поради. 

#include <stdio.h> 
#include <stdlib.h>

int main(void) {

    system("chcp 1251");
    int num;
    printf("Введіть число: \n");
    scanf_s("%d", &num);


    if (num <= 0)
    {
        printf("не можливо обробити ваші дані");
    }
    else if (num >= 4000)
    {
        printf("не можливо обробити ваші дані");
    }
    else {
        printf("Число в Римській СЧ: \n ");
        while (num > 0) {

            if (num >= 1000)       // 1000 - M
            {
                printf("M");
                num -= 1000;
            }

            else if (num >= 900)   // 900 -  CM
            {
                printf("CM");
                num -= 900;
            }

            else if (num >= 500)   // 500 - D
            {
                printf("D");
                num -= 500;
            }

            else if (num >= 400)   // 400 -  CD
            {
                printf("CD");
                num -= 400;
            }

            else if (num >= 100)   // 100 - C
            {
                printf("C");
                num -= 100;
            }

            else if (num >= 90)    // 90 - XC
            {
                printf("XC");
                num -= 90;
            }

            else if (num >= 50)    // 50 - L
            {
                printf("L");
                num -= 50;
            }

            else if (num >= 40)    // 40 - XL
            {
                printf("XL");
                num -= 40;
            }

            else if (num >= 10)    // 10 - X
            {
                printf("X");
                num -= 10;
            }

            else if (num >= 9)     // 9 - IX
            {
                printf("IX");
                num -= 9;
            }

            else if (num >= 5)     // 5 - V
            {
                printf("V");
                num -= 5;
            }

            else if (num >= 4)     // 4 - IV
            {
                printf("IV");
                num -= 4;
            }

            else if (num >= 1)     // 1 - I
            {
                printf("I");
                num -= 1;
            }
        }
    }

    return 0;
}
Подякували: 0xDADA11C7, koala2

2

Re: "Переведення чисел із арабської системи числення в Римську"

Оце:

    if (num <= 0)
    {
        printf("не можливо обробити ваші дані");
    }
    else if (num >= 4000)
    {
        printf("не можливо обробити ваші дані");
    }

можна переписати коротше:

    if ((num <= 0) || (num >= 4000))
    {
        printf("не можливо обробити ваші дані");
    }
Подякували: lesivsolomiya1

3

Re: "Переведення чисел із арабської системи числення в Римську"

Дякую за вашу відповідь, але хочу запитати чи код в цілому нормальний, бо він то працює, але можливо, мені здається, потрібно було зробити її за іншим алгоритмом?

4

Re: "Переведення чисел із арабської системи числення в Римську"

В цілому код нормальний, за іншим алгоритмом можна зробити (якщо ви справді прагнете знань, то зробіть), але великого скорочення коду/збільшення швидкодії/підвищення зрозумілості інший алгоритм не принесе, бо саме завдання дрібненьке.

Подякували: lesivsolomiya, koala2

5

Re: "Переведення чисел із арабської системи числення в Римську"

Як варіант, можна "скоротити" макросами

#include <stdio.h> 
#include <stdlib.h>

#define ROME(n, c) while(num >= n){printf(c);num -= n;}

int main(void) {

    system("chcp 1251");
    int num;
    printf("Введіть число: \n");
    scanf_s("%d", &num);

    if ((num <= 0)||(num >= 4000))
    {
        printf("не можливо обробити ваші дані");
    } else {
        printf("Число в Римській СЧ:\n");

        ROME(1000,"M")
        ROME(900, "CM")
        ROME(500, "D")
        ROME(400, "CD")
        ROME(100, "C")
        ROME(90,  "XC")
        ROME(50,  "L")
        ROME(40,  "XL")
        ROME(10,  "X")
        ROME(9,   "IX")
        ROME(5,   "V")
        ROME(4,   "IV")
        ROME(1,   "I")
    }
    return 0;
}
Подякували: lesivsolomiya, 0xDADA11C7, ch0r_t3