A1082 Read Number in Chinese (25)(25 分)
A1082 Read Number in Chinese (25)(25 分)
Given an integer with no more than 9 digits, you are supposed to read it in the traditional Chinese way. Output "Fu" first if it is negative. For example, -123456789 is read as "Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu". Note: zero ("ling") must be handled correctly according to the Chinese tradition. For example, 100800 is "yi Shi Wan ling ba Bai".
Input Specification:
Each input file contains one test case, which gives an integer with no more than 9 digits.
Output Specification:
For each test case, print in a line the Chinese way of reading the number. The characters are separated by a space and there must be no extra space at the end of the line.
Sample Input 1:
-123456789
Sample Output 1:
Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu
Sample Input 2:
100800
Sample Output 2:
yi Shi Wan ling ba Bai
思路
这个和某个基础编程题目集里的相似,一时半会想不到了。
7-23 币值转换(20 分)https://pintia.cn/problem-sets/14/problems/803
代码
#include<stdio.h>
int main ()
{
int n, initial_n;
scanf("%d", &n);
initial_n = n; // 保留初始值
char num[10] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};//数字转字母
char unit[10] = {0, 0, 'S', 'B', 'Q', 'W', 'S', 'B', 'Q', 'Y'};//舍弃前两位
char result[17]={0}; // 9 位数最多有 17 位输出
int i, last_i = n % 10; //保存前一位的想法是我所欠缺的
int j = 0;
int count_n = 0;
while (n > 0) {
i = n % 10;
n /= 10;//奇怪,不断除以10,是从右边取下一个数,和我从左取数不同
count_n ++;//数字总位数
if (i == 0 && (count_n % 4) != 1) { // 每4位后导0不输出
//从十位开始统计(个位0与万位0永远不输出)
if (last_i != 0) { // 如果前一位不等于 0,那就输出这个 0
result[j++] = num[i]; // count_n % 4) > 1即2.3.6.7位的零才能输出
}
}
//这里有问题,2220300,贰佰贰拾贰万零叁佰
//2003000, 贰佰万叁仟 ,注意万位0是不输出的,这里0可输出也可不输出
//阿拉伯金额数字万位和元位是"0",
// 或者数字中间连续有几个"0",
// 万位、元位也是"0",
// 但千位、角位不是"0"时,
// 中文大写金额中可以只写一个零字,
// 也可以不写"零"字。如¥1680.32,
// 应写成人民币壹仟陆佰捌拾元零叁角贰分,
// 或者写成人民币壹仟陆佰捌拾元叁角贰分,
// 又如¥107000.53,
// 应写成人民币壹拾万柒仟元零伍角叁分,
// 或者写成人民币壹拾万零柒仟元伍角叁分。
if (count_n == 5 && i == 0 && initial_n < 100000000) {
result[j++] = unit[count_n]; // 万 w 是一定要输出的,保证了w一定输
}
if (count_n > 1 && i != 0) { // 非 0 时输出单位
result[j++] = unit[count_n];
}
if (i != 0) { // 处理非 0 数的输出
result[j++] = num[i];
}
last_i = i; //保留 i 的前一位的值 用于处理 0
}
if (initial_n == 0) { // 处理特殊值 0
result[j++] = num[0];
}
for (int k=j-1; k>=0; k--) {
printf("%c", result[k]);//采用倒着的字符数组
}
printf("\n");
return 0;
}
现在回想,和A1082一样,本质是0的问题。

4位一节,每节的个十百位非零位高一位的零,是要输出零的。
这就是原则。
#include <cstdio>
#include <cstring>
char num[10][5] = {
"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"
};
char wei[5][5] = {"Shi", "Bai", "Qian", "Wan", "Yi"};
int main() {
char str[15];
gets(str);
int len = strlen(str);
int left = 0, right = len - 1;
if(str[0] == '-') {
printf("Fu");
left++;
}
while(left + 4 <= right) {
right -= 4;
}
while(left < len) {
bool flag = false;
bool isPrint = false;
while(left <= right) {
if(left > 0 && str[left] == '0') {
flag = true;
} else {
if(flag == true) {
printf(" ling");
flag = false;
}
if(left > 0) {
printf(" ");
}
printf("%s", num[str[left] - '0']);
isPrint = true;
if(left != right) {
printf(" %s", wei[right - left - 1]);
}
}
left++;
}
if(isPrint == true && right != len - 1) {
printf(" %s", wei[(len - 1 - right) / 4 + 2]);
}
right += 4;
}
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
char num[10][5] = {
"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"
};
char wei[5][5] = {"Shi", "Bai", "Qian", "Wan", "Yi"};
int main() {
char str[15];
gets(str);//读入一行字符串,记录数字
int len = strlen(str);//字符串长度
int left = 0, right = len - 1;//leftright分别指向字符串首尾元素
if(str[0] == '-') {//负数,输出“Fu”,把left右移一位
printf("Fu");
left++;
}
while(left + 4 <= right) {
right -= 4;//将right每次左移4位,直到left与right在同一节
}
/*这一步,直接令right为3或4行吗,不行,因为是从个位即字符串的末尾4位又4位的计算
如果翻转字符串还差不多
left指向当前需要输出的位,right指向与left同节的个位*/
while(left < len) {//循环每次处理数字的一节(4位或小于4位)
bool flag = false;//此时表示没有累积的0
bool isPrint = false;//表示该节没有输出过其中的位
while(left <= right) {//从左至右处理数字中某节的每一位
if(left > 0 && str[left] == '0') {//如果当前位为0
flag = true;//令标记flag为true
} else {//如果当前位不为0
if(flag == true) {//如果存在累积的0
printf(" ling");
flag = false;
}
//只要不是首位(包括负号),后面的每一位前都要输出空格
if(left > 0) {
printf(" ");
}
printf("%s", num[str[left] - '0']);//输出当前位数字
isPrint = true;//该节至少有一位被输出
if(left != right) {//某节中除了个位外,都需要输出十百千
printf(" %s", wei[right - left - 1]);//输出十百千的映射,简单推理得到
}
}
left++;//left右移一位
}
if(isPrint == true && right != len - 1) {//只要不是个位,就输出万或者亿
printf(" %s", wei[(len - 1 - right) / 4 + 2]);//输出万位和亿位,len-1-right值取4或8,取不到12
}
right += 4;//righr右移4位,输出下一节
}
return 0;
}
终于要进入入门篇(2)算法初步了,其实现在应该做完第六章才对,知识储备足够了。
A1082 Read Number in Chinese (25)(25 分)的更多相关文章
- 1082 Read Number in Chinese (25 分)
1082 Read Number in Chinese (25 分) Given an integer with no more than 9 digits, you are supposed to ...
- A1082 Read Number in Chinese (25 分)
1082 Read Number in Chinese (25 分) Given an integer with no more than 9 digits, you are supposed t ...
- A1082. Read Number in Chinese
Given an integer with no more than 9 digits, you are supposed to read it in the traditional Chinese ...
- PAT甲级——A1082 Read Number in Chinese
Given an integer with no more than 9 digits, you are supposed to read it in the traditional Chinese ...
- PAT 1082 Read Number in Chinese[难]
1082 Read Number in Chinese (25 分) Given an integer with no more than 9 digits, you are supposed to ...
- pat1082. Read Number in Chinese (25)
1082. Read Number in Chinese (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yu ...
- PAT1082:Read Number in Chinese
1082. Read Number in Chinese (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yu ...
- 怎么设置BarTender中二维码大小为25*25
有小伙伴近期问了小编一个问题,说客户需要25*25大小的QR Code二维码,用BarTender怎么做出来?想要指定条形码的大小,还得BarTender符号与版本选项来帮忙.本文小编就来给大家详细讲 ...
- JAVA题目:正整数n若是其平方数的尾部,则称n为同构数 如:5*5=25, 25*25=625 问: 求1~99中的所有同构数
1 /*题目:正整数n若是其平方数的尾部,则称n为同构数 2 如:5*5=25, 25*25=625 3 问: 求1~99中的所有同构数 4 */ 5 //分析:将1-99分为1-9和10-99,用取 ...
随机推荐
- JS展示预览PDF。
刚好遇到需求,需要在手机端--展示一个电子收据,电子收据返回是PDF格式的,所以需要在前端上面去做PDF预览. 在学习过程中,了解到一种很简单,不需要任何插件的方法做PDF预览,但是这方法有局限性. ...
- Java学习笔记--字符串和文件IO
1.Java中的字符串类和字符的表示 2.区分String,StringBuilder和StringBuffer 3.从命令行中给main方法传递参数 4.文件操作 1 Java中的字符串和字符 1. ...
- 微信支付配置参数:支付授权目录、回调支付URL
一.开通微信支付的首要条件是:认证服务号或政府媒体类认证订阅号(一般认证订阅号无法申请微信支付) 二.微信支付分为老版支付和新版支付,除了较早期申请的用户为老版支付,现均为新版微信支付. 三.公众平台 ...
- JAVA爬虫---验证码识别技术(一)
Python中有专门的图像处理技术比如说PIL,可以对验证码一类的图片进行二值化处理,然后对图片进行分割,进行像素点比较得到图片中的数字.这种方案对验证码的处理相对较少,运用相对普遍,很多验证码图片可 ...
- 未整理js
函数+对象=方法 方法是动作 有参数的函数=实例 使用new关键字和函数来创建一个实例 var p =new Point(1,1)//平面几何的点 表示遍历的语句样子: for(var i =0; i ...
- 如何修改HDFS上文件
如果只想append操作: . echo "<Text to append>" | hdfs dfs -appendToFile - yourHdfsPath/test ...
- python:使用OpenSSL
(一)安装pyOpenSSL 1.下载并安装 https://launchpad.net/pyopenssl pyOpenSSL-0.11.winxp32-py2.7.msi ...
- [Asp.Net] web api 部署注意事项
在将web api项目部署到IIS上的时候 要将应用程序池设置成.net framework 4.0版本
- 如何用WebIDE打开并运行CRM Fiori应用
访问Web IDE url 在Web IDE里进行项目clone操作: https://:8080/#/admin/projects/fnf/customer/cus.crm.opportunity ...
- 使用bouncycastle进行DESede/DESeee/AES128/AES192/AES256的加解密
前言 默认的jdk不支持DESeee的算法,本地化的JDK中配置有拦截规则,可以通过使用bouncycastle的jar包中的DESEngine类来进行DESeee算法的运算. DES的8字节加解密 ...