羅馬數字包含以下七種字元: 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++
)/* 進行數制轉換 */
}
程式如下:
出現報錯:address sanitizer: se** on unknown address 0x02007428cac2 (pc 0x00000040247e bp 0x7ffd0a52b010 sp 0x7ffd0a52b000 t0)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;
}
原因是:段錯誤,段錯誤是指訪問的記憶體超過了系統所給這個程式的記憶體空間。這裡返回的指標指向內容的是函式的棧,在函式呼叫完畢之後就會釋放棧中的資料,所以返回時段錯誤。
所以嘗試著用
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 通常...