本文主要是介绍将输入的阿拉伯数字转化为大写汉字输出【大疆秋招编程题】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目描述:将输入的阿拉伯数字转化为大写汉字输出,备注:输入为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 - 1count--;
}
此处当时在做的时候有个小问题,由于数据比位数的数组要滞后以为,例如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;
}
存在的问题就是字典中的“整”字,把程序贴出来就是做个记录以防终面要复盘逻辑,等周末面完大疆三面了再来修改吧。
仅供参考。
这篇关于将输入的阿拉伯数字转化为大写汉字输出【大疆秋招编程题】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!