將輸入的阿拉伯數字轉化爲大寫漢字輸出【大疆秋招編程題】

題目描述:將輸入的阿拉伯數字轉化爲大寫漢字輸出,備註:輸入爲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;
}

存在的問題就是字典中的“整”字,把程序貼出來就是做個記錄以防終面要覆盤邏輯,等週末面完大疆三面了再來修改吧。

僅供參考。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章