IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 打印罗马字符 -> 正文阅读

[C++知识库]打印罗马字符

问题:

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

字符数值
I1
V5
X10
L50
C100
D500
M1000

例如, 罗马数字 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++;
?? ?}
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-17 11:19:46  更:2022-01-17 11:21:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:03:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码