題目描述:將輸入的阿拉伯數字轉化爲大寫漢字輸出,備註:輸入爲9位數以下,高出報錯。
例如:輸入234—輸出爲貳佰叄拾肆,輸入123456789—輸出爲壹億貳仟叄佰肆拾伍萬陸仟柒佰捌拾玖。
是上個月大疆筆試的測開編程題,後來覆盤時發現網上沒有很好的C語言版本,於是把我的答案貼出來做個記錄。
編譯環境:C
解題思路:因爲時間比較緊,所以就是建立如下的查詢字典,找對應的數據然後提取並輸出:
char a[10][4] = { "零", "壹", "貳", "叄", "肆", "伍", "陸", "柒", "捌", "玖" };
char b[6][4] = { "整","拾","佰","仟","萬","億" };
(由於漢字是佔2個字符,屬於const char[3]類型的數據,選用char a[10][4]這樣的二維數組進行定義)
首先是提取出輸入數據的位數與每一位的數字:
while (n != 0)
{
r[i] = n % 10; //r[]中存放每一位的數據
i++;
n /= 10;
count++; //count爲輸入數據的位數
}
接下來的數字就按順序調用就行,關於位數的調用分爲以下四種情況:
①5位數以下:則順序調用("整","拾","佰","仟","萬");
②5-8位數之間:對於6-8位數要先調用("拾","佰","仟");
③9位數:要先調用("億");
④9位數以上:輸出報錯;
對於第一種情況:
for (i = count - 1; i >= 0; i--)
{
printf("%s%s", a[r[i]], b[i]); //因爲第3位數對應的存在r[2]中,因此i=count - 1
count--;
}
此處當時在做的時候有個小問題,由於數據比位數的數組要滯後以爲,例如r[2]對應的第三位數後應該接b[2],但實際上b[2]是“仟”了,因此當時在b[0]處增加了“整”,好讓兩個數組同步。如果單純的b[i-1],會訪問無效數據地址,當時這裏卡了一下,爲了趕時間所以就用暴力加字了。。。
對於第二種情況:
for (i = count - 5; i > 0; i--)
{
printf("%s%s", a[r[i+4]], b[i]);//與上述原因相同,第6位數存在r[5]中,因此a[r[i+4]];
count--;
}
對於第三種情況:
就比較簡單了,只限制了億位(其實再高也就是上述兩種情況的重複),因此對於第9位設置爲:
if (count == 9)
{
printf("%s%s", a[r[count-1]], b[count-4]);
count--;
}
完整的代碼爲:
#include <stdio.h>
int main()
{
int count = 0; //count是數字位數
int i = 0;
int r[10] = {0};//默認是十位數
int n;
char a[10][4] = { "零", "壹", "貳", "叄", "肆", "伍", "陸", "柒", "捌", "玖" };
char b[6][4] = { "整","拾","佰","仟","萬","億" };
printf("請輸入金額:");
scanf_s("%d", &n);
while (n != 0)
{
r[i] = n % 10;
i++;
n /= 10;
count++;
}
printf("數組中的內容: \n");
while (count >= 0)
{
if (count > 9)
{
printf("輸入錯誤,請重新輸入");
break;
}
if (count == 9)
{
printf("%s%s", a[r[count-1]], b[count-4]);
count--;
}
else if (count >= 6 && count <= 8)
{
for (i = count - 5; i > 0; i--)
{
printf("%s%s", a[r[i+4]], b[i]);
count--;
}
}
else if (count <= 5 && count >= 0)
{
for (i = count - 1; i >= 0; i--)
{
printf("%s%s", a[r[i]], b[i]);
count--;
}
}
}
return 0;
}
存在的問題就是字典中的“整”字,把程序貼出來就是做個記錄以防終面要覆盤邏輯,等週末面完大疆三面了再來修改吧。
僅供參考。