前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >打印罗马字符_ascii非打印控制字符

打印罗马字符_ascii非打印控制字符

作者头像
全栈程序员站长
发布于 2022-11-19 04:39:02
发布于 2022-11-19 04:39:02
7970
举报

大家好,又见面了,我是你们的朋友全栈君。

问题:

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M,其对应关系如下表:

字符

数值

I

1

V

5

X

10

L

50

C

100

D

500

M

1000

例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。

通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:

I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。 X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

你的任务是设计一个算法,将一个整数转换为罗马数字。不巧的是,此时打印机恰好发生了一些故障。它不能够打印某些字符,否则将会发生故障彻底损坏。因此,你需要将这部分字符从生成的罗马数字中剔除掉。

Input

输入有两行

第一行为一个整数num,代表要转换的数,其中1 <= num <= 3999;

第二行为一个字符串,字符串中的字符不能在结果中出现,保证字符串的长度不会超过3。

Output

输出为一个字符串,代表转换成的罗马数字。如果罗马数字全部不能打印,则输出空行。

Sample Input

9 I

Sample Output

X

//这题对我来说有些难度,这里我总结了一点心得,分享一下

解题思路

任务一:将正整数转化成罗马字符

任务二:筛选掉我们不需要的字符

接下来我分任务给出不同解法

主函数部分(略了)

#include<stdio.h> #include<string.h> void change(int num,char *sh); void del(char* sh,char* ch); int main(){ int num; char ch[3]={}; char sh[100]={}; scanf(“%d %s”,&num,&ch); change(num,sh); del(sh,ch); printf(“%s”,sh);

} 任务一:将正整数转罗马字符串

方法一: //找离该数最大的罗马字符 int stomax(int num){ int reflect[13]={1,4,5,9,10,40,50,90,100,400,500,900,1000}; int cuns=0; for(int i=0;i<13;i++){ if(reflect[i]>num){ break; } cuns=i; } return cuns; }

void change(int num,char* sh){ char roman[14][3]={“I”,”IV”,”V”,”IX”,”X”,”XL”,”L”,”XC”,”C”,”XD”,”D”,”XM”,”M”}; int reflect[13]={1,4,5,9,10,40,50,90,100,400,500,900,1000}; //用num去除数,寻找需要的罗马字符个数 int cuns=stomax(num); int cn=0; while(num>0){ int t=num/reflect[cuns]; num=num%reflect[cuns]; for(int j=0;j<t;j++){ //以下这句很想用上指针或者strcpy或者strcat,奈何我不会用 ,求大家带带我 for(int k=0;k<strlen(roman[cuns]);k++){ sh[cn++]=roman[cuns][k]; } } cuns=stomax(num); } }

方法二:

void change(int num,char* sh){ char roman[14][3]={“I”,”IV”,”V”,”IX”,”X”,”XL”,”L”,”XC”,”C”,”XD”,”D”,”XM”,”M”}; int reflect[13]={1,4,5,9,10,40,50,90,100,400,500,900,1000}; for(int i=12,j=0;i>=0;i–){ while(reflect[i]<=num){ num-=reflect[i];//这里就是精髓啊 for(int k=0;k<strlen(roman[i]);k++){ sh[j++]=roman[i][k]; } } } }

任务二:除去对应的字符

方法一: void del(char* sh,char* ch){ //利用双指针,一个判断,一个存储 int i,j; for(i=0,j=0;i<strlen(sh);i++){ for(int k=0;k<strlen(ch);k++){ if(sh[i]==ch[k]) continue; else { *(sh+j)=*(sh+i); j++; } } } *(sh+j)=’\0′;//这里一定要注意,有了它数组不需要的部分才会消失 }

方法二:

#include<stdlib.h>//不要忘了,用malloc必备

char *del(char* sh,char* ch){ printf(“%p “,sh); char *shf=(char*)malloc(sizeof(char)*strlen(sh)); int i=0,j=0; for(i=0,j=0;i<strlen(sh);i++){ for(int k=0;k<strlen(ch);k++){ if(sh[i]!=ch[k]){ *(shf+j)=sh[i]; j++; } } } *(shf+j)=’\0′; return shf;//为啥这里是返回而不是直接让sh=shf?

//因为sh实际是局部形式指针参数,是一个地址与原sh一样的指针,把sh的地址赋值为shf的地址并不能改变原sh 的值,从而没有意义。上面是因为在sh的原地址做出了改变,所以有意义。除了直接return,还能将形参修改成全局变量,我还不会,会了再补充。 }

方法三:链表法

虽然没输出,也放这了,有空再改。(主要是思想😁,将不需要元素的地址跳过)

void del(char* sh,char* ch){ char *shf=(char*)malloc(sizeof(char)*strlen(sh)); while(sh!=NULL || sh+1!=NULL){ for(int i=0;i<strlen(ch);i++){ if(*sh==ch[i]){ shf=sh+1; sh++; sh=shf+1; }else{ sh++; } } sh++; } }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/187507.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月30日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
轻松一刻——LeetCode题目13:罗马数字转整数
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。27 写做 XXVII, 即为 XX + V + II 。
二环宇少
2020/08/13
3030
Leetcode12 整数转罗马数字
字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
Swingz
2020/12/18
2620
每日一刷:罗马数字转整数
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 X + V + II 。
乐心湖
2021/02/25
3390
【力扣刷题】12. 整数转罗马数字
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。
jayjay
2022/11/02
2090
【力扣刷题】12. 整数转罗马数字
C语言每日一题(46)整数转罗马数字
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
对编程一片赤诚的小吴
2024/01/23
2070
C语言每日一题(46)整数转罗马数字
12. 整数转罗马数字
例如, 罗马数字 2 写做 II,即为两个并列的 1。12 写做 XII,即为 X+ II。 27 写做 XXVII, 即为 XX+ V+ II。
GeekLiHua
2025/01/21
620
LeetCode 13. 罗马数字转整数(贪心)
字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
SakuraTears
2022/01/13
4650
【Leetcode-13.罗马数字转整数 -14.最长公共前缀】
例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
YoungMLet
2024/03/01
1140
Leetcode算法系列| 12. 整数转罗马数字
游戏开发小Y
2024/01/18
1300
Leetcode算法系列| 12. 整数转罗马数字
罗马数字背后的秘密——LeetCode XII XIII 题记
印象中的罗马数字,多出现在文档标题或序号中:I、II、III、IV、V、VI 等。它是阿拉伯数字传入之前使用的一种数码。其采用七个罗马字母作数字:Ⅰ(1)、X(10)、C(100)、M(1000)、V(5)、L(50)、D(500),注意是没有 0 的。罗马数字的记数方法如下:
TTTEED
2020/07/08
1.1K0
Python练习【3】【罗马数字转换/查
示例 1: 输入: “III” 输出: 3 示例 2: 输入: “IV” 输出: 4 示例 3: 输入: “IX” 输出: 9 示例 4: 输入: “LVIII” 输出: 58 解释: C = 100, L = 50, XXX = 30 and III = 3. 示例 5: 输入: “MCMXCIV” 输出: 1994 解释: M = 1000, CM = 900, XC = 90 and IV = 4.
py3study
2020/01/06
1.6K0
LeetCode 12/13 罗马数字与整型互转(哈希,贪心)
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
Michael阿明
2020/07/13
4690
LeetCode 12/13 罗马数字与整型互转(哈希,贪心)
数据结构与算法 -2 :罗马数字与整数的相互转换
例如,罗马数字2写做II,即为两个并列的1。12写做 XII,即为 X + II 。27 写做XXVII,即为XX+V+II。
石璞东
2020/05/20
6280
LeetCode 12. 整数转罗马数字(字符串)(贪心算法)
title: '' date: 2020-12-22 19:15:18 tags: [算法,贪心,字符串,LeetCode] published: true hideInList: false feature: https://cdn.jsdelivr.net/gh/ZSakuraTears/cdn/img/Dl0g4BB4Fp.jpg
SakuraTears
2022/01/13
3730
力扣12&13-整数与罗马数字互换
原题链接:https://leetcode.cn/problems/integer-to-roman/
WuShF
2023/02/22
3980
力扣12&13-整数与罗马数字互换
罗马字符转换数字_数字变成字符串怎么改过来
今天在力扣上做了一道这个题,还算简单,主要是理解规则。解法也有很多种,我这里用的是常规解法,先将输入进来的字符串转换为字符数组,然后进行一系列操作。
全栈程序员站长
2022/11/11
5350
罗马字符转换数字_数字变成字符串怎么改过来
【力扣算法13】之 12. 整数转罗马数字 python
首先,我们将罗马数字的字符和对应的数值存储在两个数组中。roman_chars数组存储了罗马数字的字符,roman_values数组存储了对应的数值。例如,'I’对应的数值是1,'V’对应的数值是5,以此类推。
全栈若城
2024/02/29
1610
【力扣算法13】之 12. 整数转罗马数字 python
【leetcode】13:罗马数字转整数
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
乔戈里
2019/05/14
6220
力扣刷题笔记--12. 整数转罗马数字 python解法
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做  XXVII, 即为 XX + V + II 。
C_H
2022/11/15
4570
C#版 - Leetcode 12. 整数转罗马数字 - 题解
在线提交: https://leetcode.com/problems/integer-to-roman/
Enjoy233
2019/03/05
1.3K0
相关推荐
轻松一刻——LeetCode题目13:罗马数字转整数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档