我有這個程式試圖從阿拉伯數字轉換為羅馬數字再到阿拉伯數字,它編譯沒有問題,但是對于某些值它給出了正確的答案,但對于其他情況它沒有。例如:
11 錯誤(X 留在 X 的左側) 12 錯誤(X 留在 X 的左側)
20好
22 是錯誤的(2 X 剩余)
30好
32 錯誤(剩余 2 X)
40好
45 是錯誤的(還有一個 XL) 48 是錯誤的(一個 X 在第二個 L 之前仍然存在)
50好
51 給出了不好的(剩下一個 L) 58 是壞的(剩下一個 L)
60不錯
char *a2roman (int valor, char *c1, char *c2, char *c3);
int main (void)
{
int ArabicNumber = 1;
int result;
char roman[15] = "";
do
{
printf ("Enter an integer in the range 1 to 3000: \n\t");
scanf ("%d", &ArabicNumber);
}
while ((ArabicNumber < 1) || (ArabicNumber > 3000));
if ((ArabicNumber <= 3000) && (ArabicNumber >= 1000))
{
result = ArabicNumber / 1000;
strcat (roman, a2roman(result, "M", " ", " "));
ArabicNumber -= (result * 1000);
}
if ((ArabicNumber < 1000) && (ArabicNumber >= 100))
{
result = ArabicNumber / 100;
strcat (roman, a2roman(result, "C", "D", "M"));
ArabicNumber -= (result * 100);
}
if ((ArabicNumber < 100) && (ArabicNumber >= 10))
{
result = ArabicNumber / 10;
strcat (roman, a2roman(result, "X", "L", "C"));
ArabicNumber -= (result * 10);
}
if ((ArabicNumber < 10) && (ArabicNumber >= 1))
{
strcat (roman, a2roman(ArabicNumber, "I", "V", "X"));
}
printf ("The Roman numeral is: \n\t%s\n\n", roman);
printf ("\t\t...Press any key to finish.");
getch();
return 0;
}
char *a2roman (int value, char *c1, char *c2, char *c3)
{
int i;
static char rRoman[15] = "";
/* Si "valor" = 1, 2, 3 */
if ((value >= 1) && (value <= 3))
{
for (i = 0; i < value; i )
strcat (rRoman, c1);
}
/* Si "valor" = 5, 6, 7, 8 */
if ((value >= 5) && (value <= 8))
{
strcat (rRoman, c2);
for (i = 0; i < (value - 5); i )
strcat (rRoman, c1);
}
/* Si "valor" = 4 */
if (value == 4)
{
strcat (rRoman, c1);
strcat (rRoman, c2);
}
/* Si "valor" = 9 */
if (value == 9)
{
strcat (rRoman, c1);
strcat (rRoman, c3);
}
return (rRoman);
}
uj5u.com熱心網友回復:
內部的靜態緩沖區a2roman構建完整的結果,但每次從main部分結果呼叫它時也會連接到列印輸出的緩沖區,因此如果a2roman多次呼叫,則會得到重復。
一種解決方案是a2roman在構建完整結果之后直接使用回傳值,方法是創建roman一個指標并a2roman每次將回傳值分配給它,a2roman如下所示:
char* roman = NULL;
...
roman = a2roman(result, "M", " ", " ");
...
roman = a2roman(result, "C", "D", "M");
...
printf ("The Roman numeral is: \n\t%s\n\n", roman);
但是,如果您想轉換多個數字,由于靜態緩沖區,您仍然會遇到問題。如果你有一個指向它的指標,你可以在數字之間清除它,*roman = 0;但這對我來說仍然感覺很亂。
另一種解決方案是傳入要在其中構造數字的緩沖區。
下面的示例展示了如何做到這一點,并清理了一些用于將數字分解為數字的邏輯。你有什么作業,但我想我不妨展示一種替代方法并節省幾行。
#include <stdio.h>
#include <string.h>
void addDigit(char* out, int digit, const char* c1, const char* c2, const char* c3)
{
if ((digit >= 1) && (digit <= 3))
{
for (int i = 0; i < digit; i )
{
strcat(out, c1);
}
}
if ((digit >= 5) && (digit <= 8))
{
strcat(out, c2);
for (int i = 0; i < (digit - 5); i )
{
strcat(out, c1);
}
}
if (digit == 4)
{
strcat(out, c1);
strcat(out, c2);
}
if (digit == 9)
{
strcat(out, c1);
strcat(out, c3);
}
}
void convertNumber(char* out, int num)
{
if ((num <= 3000) && (num >= 1000))
{
addDigit(out, num / 1000, "M", " ", " ");
num %= 1000;
}
if ((num < 1000) && (num >= 100))
{
addDigit(out, num / 100, "C", "D", "M");
num %= 100;
}
if ((num < 100) && (num >= 10))
{
addDigit(out, num / 10, "X", "L", "C");
num %= 10;
}
if ((num < 10) && (num >= 1))
{
addDigit(out, num, "I", "V", "X");
}
}
int main(void)
{
for (int i = 1; i < 100; i = 3)
{
char buf[32] = { 0 };
convertNumber(buf, i);
printf("M = %s\n", i, buf);
}
for (int i = 101; i < 3000; i = 101)
{
char buf[32] = { 0 };
convertNumber(buf, i);
printf("M = %s\n", i, buf);
}
return 0;
}
在線示例
輸出:
1 = I
4 = IV
7 = VII
10 = X
13 = XIII
16 = XVI
19 = XIX
22 = XXII
25 = XXV
28 = XXVIII
31 = XXXI
34 = XXXIV
37 = XXXVII
40 = XL
43 = XLIII
46 = XLVI
49 = XLIX
52 = LII
55 = LV
58 = LVIII
61 = LXI
64 = LXIV
67 = LXVII
70 = LXX
73 = LXXIII
76 = LXXVI
79 = LXXIX
82 = LXXXII
85 = LXXXV
88 = LXXXVIII
91 = XCI
94 = XCIV
97 = XCVII
101 = CI
202 = CCII
303 = CCCIII
404 = CDIV
505 = DV
606 = DCVI
707 = DCCVII
808 = DCCCVIII
909 = CMIX
1010 = MX
1111 = MCXI
1212 = MCCXII
1313 = MCCCXIII
1414 = MCDXIV
1515 = MDXV
1616 = MDCXVI
1717 = MDCCXVII
1818 = MDCCCXVIII
1919 = MCMXIX
2020 = MMXX
2121 = MMCXXI
2222 = MMCCXXII
2323 = MMCCCXXIII
2424 = MMCDXXIV
2525 = MMDXXV
2626 = MMDCXXVI
2727 = MMDCCXXVII
2828 = MMDCCCXXVIII
2929 = MMCMXXIX
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/478937.html
上一篇:如何使用C結構實作最佳的類繼承?
