Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Chuyển số nguyên sang số La Mã trong C


Cho số thập phân n, chuyển sang số La Mã. n trong khoảng 1 đến 4000. Bảng số La Mã:

SốChữ số La Mã
1I
4IV
5V
9IX
10X
40XL
50L
90XC
100C
400CD
500D
900CM
1000M
4000MMMM

VD: n = 859 -> DCCCLIX

Giải pháp:

  • Mảng lưu chữ số La Mã và giá trị tương ứng (nume array)
  • Đệ quy: hàm decToRom(nume, num)
  • Nếu num != 0:
    • max := giá trị lớn nhất trong nume không lớn hơn num
    • Nối ký hiệu của max vào kết quả
    • num := num - max value
    • Gọi đệ quy decToRom(nume, num)

Ví dụ

#include 
typedef struct{
    char *sym;
    int val;
}numeral;
int maxNume(numeral *nu, int num){
    int i, index;
    for(i = 0; i < 15; i++){
        if(nu[i].val <= num)
            index = i;
    }
    return index;
}
void decToRoman(numeral *nu, int num){
    int max;
    if(num != 0){
        max = maxNume(nu, num);
        printf("%s", nu[max].sym);
        num -= nu[max].val;
        decToRoman(nu, num);
    }
}
main(){
    int number;
    numeral nume[15] = {{"I",1},{"IV",4},{"V",5},{"IX",9},{"X",10},{"XL",40},{"L",50},{"XC",90},{"C",100},{"CD",400},{"D",500},{"CM",900},{"M",1000},{"MMMM",4000},{"V'",5000}};
    printf("Enter a decimal number: ");
    scanf("%d", &number);
    if(number > 0 && number <= 5000){
        printf("The Roman equivalent of %d is ", number);
        decToRoman(nume, number);
    }
    else{
        printf("Invalid Input");
    }
    printf("\n");
}

Đầu vào

570 3574

Đầu ra

DLXX MMMDLXXIV