LeetCode 12 整數轉羅馬數字

2021-10-24 08:59:23 字數 3003 閱讀 1446

羅馬數字包含以下七種字元: i, v, x, l,c,d 和 m。

字元 數值

i 1v 5

x 10

l 50

c 100

d 500

m 1000

例如, 羅馬數字 2 寫做 ii ,即為兩個並列的 1。12 寫做 xii ,即為 x + ii 。 27 寫做 xxvii, 即為 xx + v + ii

通常情況下,羅馬數字中小的數字在大的數字的右邊。但也存在特例,例如 4 不寫做 iiii,而是 iv。數字 1 在數字 5 的左邊,所表示的數等於大數 5 減小數 1 得到的數值 4 。同樣地,數字 9 表示為 ix。這個特殊的規則只適用於以下六種情況:

i 可以放在 v (5) 和 x (10) 的左邊,來表示 4 和 9。

x 可以放在 l (50) 和 c (100) 的左邊,來表示 40 和 90。

c 可以放在 d (500) 和 m (1000) 的左邊,來表示 400 和 900。

給定乙個整數,將其轉為羅馬數字。輸入確保在 1 到 3999 的範圍內。

剛開始想著將num徹底分解,得出num和各個數的商、餘數,然後建立數學關係來得出最終的結果。

#include

"string.h"

char

*inttoroman

(int num)

;char

*output_numerals=

null

;int preprocess[15]

=, leve=

, i, j;

//預處理結果儲存和級別

j=1;

/* 預處理num,得到num關於羅馬數字所有的係數 */

for( i=

1; i<

7; i++

)/* 進行數制轉換 */

}

寫著寫著不行了,分解不開,尋求另一種解法。

程式如下:

char

*inttoroman

(int num)

;int leve=

;char

*result;

int i=

0, j=

0, k=0;

i = num/leve[0]

;/* 先將可能超出1000的部分處理 */

if(i>0)

}/* 接下來處理小於1000的部分 */

num = num%leve[0]

;for

( i=

1; i<

13; i++

) num = num-leve[i]

; result =

strcat

( result, roman_number[i]);

}return result;

}

出現報錯:address sanitizer: se** on unknown address 0x02007428cac2 (pc 0x00000040247e bp 0x7ffd0a52b010 sp 0x7ffd0a52b000 t0)

原因是:段錯誤,段錯誤是指訪問的記憶體超過了系統所給這個程式的記憶體空間。這裡返回的指標指向內容的是函式的棧,在函式呼叫完畢之後就會釋放棧中的資料,所以返回時段錯誤。

所以嘗試著用static char *result;來修飾返回值的指標,但是這樣返回的值是null,因為雖然指向返回值的指標是儲存在函式的靜態儲存區的,函式結束後也不會銷毀靜態儲存區的區域性變數的值,但是這個靜態儲存區指標指向的位址卻隨著函式執行完畢銷毀了。

採用動態分配,再堆上申請一段空間來專門存放,**如下:

char

*result =

(char*)

malloc

(100

*sizeof

(char))

;memset

(result,0,

100*

sizeof

(char))

;

現在**如下:

char

*inttoroman

(int num)

;int i, leve[13]

=;char

*result =

(char*)

malloc

(100

*sizeof

(char))

;memset

(result,0,

100*

sizeof

(char))

;for

( i=

0; i<13;

)else

}return result;

}

結果是:

分析原因之後發現,是我的roman_number字串陣列出問題了,沒有考慮到系統自己加的『\0』結束符,所以需要更改為:char roman_number[13][3]

修改之後**為:

char

*inttoroman

(int num)

;int i, leve[13]

=;char

*result =

(char*)

malloc

(100

*sizeof

(char))

;memset

(result,0,

100*

sizeof

(char))

;for

( i=

0; i<13;

)else

}return result;

}

通過測試:

LeetCode12 整數轉羅馬數字

題目大意 將乙個1到3999範圍內的整數轉為羅馬數字 題目分析 首先熟悉轉換規則,然後可以使用兩個list儲存對應的對映關係,然後每次從大到小看num是否大於1000,大於900,大於500,若在某個區間的話,就將羅馬數字加進來,num減去相應的數值,直到num為0 展示 class solutio...

Leetcode 12 整數轉羅馬數字

題目 羅馬數字包含以下七種字元 i,v,x,l,c,d和m。字元 數值 i 1 v 5 x 10 l 50 c 100 d 500 m 1000例如,羅馬數字 2 寫做ii,即為兩個並列的 1。12 寫做xii,即為x ii。27 寫做xxvii,即為xx v ii。通常情況下,羅馬數字中小的數字在...

LeetCode 12 整數轉羅馬數字

題目鏈結 題目描述 羅馬數字包含以下七種字元 i,v,x,l,c,d 和 m。字元 數值 i 1 v 5 x 10 l 50 c 100 d 500 m 1000例如,羅馬數字 2 寫做 ii 即為兩個並列的 1。12 寫做 xii 即為 x ii 27 寫做 xxvii,即為 xx v ii 通常...