输入阿拉伯数字(整数),输出对应的中文(美团网2014年9月16日笔试题目之一)

2014年9月16日,美团网南京笔试题之一。原要求是输入整数的位数最多为四位,这里扩展为12为,即最高到千亿级别。

思路及步骤:

1 判别输入是否合法,并过滤字符串最前面的‘0’。

2 将字符串划分成四位一组的形式,其中每一组四位整数的输出方式相同。如20402040,其前四位和后四位都是2040,都输出“二千零四十”,只不过前四位要添上‘万’字而已。

3 将8~12位、4~8位、0~4位的数字分成三种情况输出

另外:形如10230401,应读为:“一千零二十三四百零一”,所以在每输出完一组数字后,应考察下一组的首位是否为0,视情况输出‘零’。

下面是实现代码:

char *arrayOfDigit[10] = { "零", "一", "二", "三", "四", "五", "六", "七", "八", "九" };
char *arrayOfIndex[7] = { "", "", "十", "百", "千", "万", "亿" };

void printGroupOf4(char *pStart, char *pEnd)
{
	int index = pEnd - pStart + 1; // 确定位数,用于在数字后添加“十、百、千”

	// 过滤字符串最前面的‘0’
	while (pStart <= pEnd && *pStart == '0'){
		++pStart;
		--index;
	}

	// 此时pStart可能“所处位置”与“字符串对应的形式”:千位(yxxx)、百位(0yxx)、十位(00yx)、个位(000y),
	// 或者直接退出(0000),其中y表示非零的整数,x表示未知的整数
	while (pStart <= pEnd && *pStart != '0'){
		cout << arrayOfDigit[*pStart - '0'] << arrayOfIndex[index];
		++pStart;
		--index;
		if (pStart > pEnd){
			return;
		}
	}

	// 设置标记,确定是否应该输出‘零’
	bool flag = false;
	while (pStart <= pEnd && *pStart == '0'){
		++pStart;
		--index;
		flag = true;
	}
	if (flag == true && pStart <= pEnd)
		cout << arrayOfDigit[0];

	// 打印最后面的转换后的字符串序列。此时pStart,要么到达非零的十位,要么直接到达了个位
	while (pStart <= pEnd && *pStart != '0'){
		cout << arrayOfDigit[*pStart - '0'] << arrayOfIndex[index];
		++pStart;
		--index;
		if (pStart > pEnd){
			return;
		}
	}
}

void digitToChinese(char *pStr)
{
	if (!pStr)
		return;

	int numberLength = strlen(pStr);

	// 检查符号位
	if (pStr[0] == '-'){
		cout << "负";
		++pStr;
		--numberLength;
	}
	else if (pStr[0] == '+'){
		++pStr;
		--numberLength;
	}

	// 过滤字符串前面的0
	while (*pStr == '0'){
		++pStr;
		--numberLength;
	}

	// 检查后面的数字是否合法
	for (int i = 0; i<numberLength; ++i){
		if (pStr[i] > '9' || pStr[i] < '0')
		{
			cout << "输入字符串不合法!" << endl;
			return;
		}
	}

	// 当输入为0时
	if (numberLength == 0){
		cout << arrayOfDigit[0];
		return;
	}

	if (numberLength > 12){
		cout << "输入数字超出表示范围(千亿级)" << endl;
		return;
	}

	// 处理前四位
	if (numberLength > 8){
		printGroupOf4(pStr, pStr + numberLength - 9);
		cout << arrayOfIndex[6];
		if (*(pStr + numberLength - 8) == '0') // 千万位为0
			cout << arrayOfDigit[0];
		
		pStr = pStr + numberLength - 8;
		numberLength = 8;
	}

	// 处理中间四位
	if (numberLength > 4){
		printGroupOf4(pStr, pStr + numberLength - 5);
		cout << arrayOfIndex[5];
		if (*(pStr + numberLength - 4) == '0') // 千位为0
			cout << arrayOfDigit[0];

		pStr = pStr + numberLength - 4;
		numberLength = 4;
	}

	// 处理最后四位
	printGroupOf4(pStr, pStr + numberLength - 1);
	
}


int main(void)
{
	char p[20];

	cout << "请输入小于12位的数字:" << endl;

	cin >> p;

	digitToChinese(p);

	return 0;
}




  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 您好,以下是获得用户输入的一个正整数输入输出该数字对应中文字符表示的代码: ``` num = int(input("请输入一个正整数:")) chinese_num = ["零", "一", "二", "三", "四", "五", "六", "七", "八", "九"] result = "" while num > : digit = num % 10 result = chinese_num[digit] + result num = num // 10 print(result) ``` 这段代码首先通过`input`函数获取用户输入的一个正整数,然后定义了一个`chinese_num`列表,其中存储了数字到9对应中文字符。接着,通过一个`while`循环,将输入的数字从个位开始逐位取出,然后根据`chinese_num`列表中的对应关系,将每一位数字转换成中文字符,并将其拼接到`result`字符串的前面。最后输出`result`字符串即可。 希望对您有帮助! ### 回答2: 题要求我们输入一个正整数,并将其转换为中文字符表示。首先我们需要确定中文字符的表示方式,按照《现代汉语词典》的规范,零到九用单个汉字表示,十到百用”十“和”百“表示,千以及以上则用”千“、”万“、”亿“依次表示。所以我们需要将输入的数字分别转换为千、百、十和个位上的数字,然后根据位权,选择相应的汉字进行拼接即可。 接下来,我们可以使用数学的互除法来实现拆分每一个位上的数字,具体步骤如下: 1、先输入一个正整数; 2、求出千、百、十、个位上的数字,比如输入的数字为3825,则千位为3,百位为8,十位为2,个位为5; 3、根据千、百、十、个位的位权,选择相应的中文字符进行拼接,比如上述数字转换为中文字符后为“三千八百二十五”。 需要注意的是,在上述步骤中,如果某一位上的数字为0,则直接忽略不计。同时,在百、十、个位上的数字为1时需特殊处理,即用单独的中文字符表示,如“十”、“百”、“千”等。 除此之外,对于超过万以上的数字,还需要考虑用“亿”、“万”隔开每一级,比如1,2345,6789应该表示为“一亿二千三百四十五万六千七百八十九”。 总体来看,实现数字转换为中文字符的方法较为繁琐,但基于互除法和基本的数学知识,我们可以较为简单地完成这一任务。 ### 回答3: 本题需要实现将一个正整数转换成中文数字的功能。我们首先需要了解中文数字的特点。 中文数字的基本表达是以“一、二、三、四、五、六、七、八、九”为基础的。十以内的数字依次是“十一、十二、……、十九”。二十到九十的数字以“二十、三十、……、九十”为基础,中间的数字通过“一、二、三、……、九”来表示。百位以上的数字以“百、千、万、亿”来划分,例如“一百三十五”表示为“一百三十五”,“一千零一十二”表示为“一千零一十二”,“一百万”表示为“一百万”,“一亿零一百万”表示为“一亿零一百万”。 接下来我们可以按照这个特点,一位一位地转换出中文数字的表示。我们可以将数字进行拆解,先将数字拆成万、千、百、十、个位五个部分。对于万以上的部分,我们可以使用递归的方法,对千百十个位进行同样的处理。在处理某一部分时,我们需要根据该部分的数值和位置,来添加对应的单位,例如“千”、“百”、“十”、“个”。 在代码实现时,我们可以将数字和对应中文字符存储在一个字典中,通过遍历输入的数字并查找字典来进行转换。同时,在程序中需要添加一些特殊情况的处理,例如“零”、“一十”等情况。 下面是一份Python代码的示例: ```python # 定义数字对应中文字符 chinese_dict = { 0: '零', 1: '一', 2: '二', 3: '三', 4: '四', 5: '五', 6: '六', 7: '七', 8: '八', 9: '九', 10: '十', 100: '百', 1000: '千', 10000: '万', 100000000: '亿' } def num_to_chinese(num): if num < 0: return None elif num < 10: return chinese_dict[num] elif num < 100: if num % 10 == 0: return chinese_dict[num // 10] + chinese_dict[10] else: return chinese_dict[num // 10] + chinese_dict[10] + chinese_dict[num % 10] elif num < 1000: if num % 100 == 0: return chinese_dict[num // 100] + chinese_dict[100] else: return chinese_dict[num // 100] + chinese_dict[100] + num_to_chinese(num % 100) elif num < 10000: if num % 1000 == 0: return chinese_dict[num // 1000] + chinese_dict[1000] else: return chinese_dict[num // 1000] + chinese_dict[1000] + num_to_chinese(num % 1000) else: for key in sorted(list(chinese_dict.keys()), reverse=True): if num >= key: return num_to_chinese(num // key) + chinese_dict[key] + num_to_chinese(num % key) ``` 示例代码适用于不超过亿位数字的转换,对于更大的数字可以根据需要进行拓展。在实际应用中,我们需要注意输入为0的情况和输入的数值范围,以避免引起错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值