文章目录

  • 1.开头
  • 2.具体先看题目内容
    • 1)要求
    • 2)例子
  • 3.我的又一次头秃探索
    • 1)认识罗马数字计数方法
    • 2)认识基本string操作
      • 1.字符串的生成
      • 2.字符串的大小和容量
      • 3.string的插入:push_back() 和 insert()
      • 4.string拼接字符串:append() & + 操作符
      • 5.string的删除:erase()
    • 3)我的实现构想

1.开头

今天在Codewars上又是碰到一个比较有趣的代码实现问题,是要我们把我们日常所用的阿拉伯数字转化为罗马数字,从中我们可以看出其中的逻辑需求是要求我们输入函数一个int型数据(不知道罗马数字里有没有小数啊哈哈),然后我们把输入的数字经过拆分根据罗马数字的表示规则重新组合,返回出一个string类型的数据。其中因为罗马数字的命名规则的奇特,我们需要对我们的string型数据进行一些基本的string操作。借由此机会来学习string类型操作的用法
呜呜呜,光写Codewars上的实战经验总结还是没人看嗷,主要是光靠实战可能无法总结出系统的知识点,对各位的帮助没有那么打。所以今后可能还会写Qt的C++GUI编程,多多指教了。

2.具体先看题目内容

1)要求

原文:
Create a function taking a positive integer as its parameter and returning a string containing the Roman Numeral representation of that integer.

Modern Roman numerals are written by expressing each digit separately starting with the left most digit and skipping any digit with a value of zero. In Roman numerals 1990 is rendered: 1000=M, 900=CM, 90=XC; resulting in MCMXC. 2008 is written as 2000=MM, 8=VIII; or MMVIII. 1666 uses each Roman symbol in descending order: MDCLXVI.

翻译君:
创建一个以正整数为参数的函数,并返回一个包含该整数的罗马数字表示形式的字符串。
现代罗马数字的书写方式是,从最左边的数字开始分别表示每个数字,然后跳过任何零值的数字。用罗马数字1990表示:1000 = M,900 = CM,90 = XC;导致MCMXC。2008表示为2000 = MM,8 = VIII; 或MMVIII。1666以降序使用每个罗马符号:MDCLXVI。

2)例子

    Assert::That(solution(182) , Equals("CLXXXII"));Assert::That(solution(1990) , Equals("MCMXC"));Assert::That(solution(1875) , Equals("MDCCCLXXV"));

3.我的又一次头秃探索

1)认识罗马数字计数方法

基本字符

基本字符 I V X L C D M
相应的阿拉伯数字表示为 1 5 10 50 100 500 1000
  1. 相同的数字连写、所表示的数等于这些数字相加得到的数、如:Ⅲ=3;
  2. 小的数字在大的数字的右边、所表示的数等于这些数字相加得到的数、 如:Ⅷ=8、Ⅻ=12;
  3. 小的数字(限于 I、X 和 C)在大的数字的左边、所表示的数等于大数减小数得到的数、如:Ⅳ=4、Ⅸ=9;
  4. 正常使用时、连写的数字重复不得超过三次;
  5. 在一个数的上面画一条横线、表示这个数扩大 1000 倍。(这个不用管,不再我们的实现范围内)
  6. 基本数字 Ⅰ、X 、C 中的任何一个、自身连用构成数目、或者放在大数的右边连用构成数目、都不能超过三个;放在大数的左边只能用一个;
  7. 不能把基本数字 V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目、只能使用一个;

2)认识基本string操作

这里,我是从YAMIZA大佬处学习的关于string的各种操作:
其出处:链接: link 点击link直达
不想自己打了,我好懒啊欸嘿嘿。。。

1.字符串的生成

 string str:生成空字符串string s(str):生成字符串为str的复制品string s(str, strbegin,strlen):将字符串str中从下标strbegin开始、长度为strlen的部分作为字符串初值string s(cstr, char_len):以C_string类型cstr的前char_len个字符串作为字符串s的初值string s(num ,c):生成num个c字符的字符串string s(str, stridx):将字符串str中从下标stridx开始到字符串结束的位置作为字符串初值————————————————
版权声明:本文为CSDN博主「YAIMZA」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37941471/article/details/82107077

2.字符串的大小和容量

1. size()和length():返回string对象的字符个数,他们执行效果相同。2. max_size():返回string对象最多包含的字符数,超出会抛出length_error异常3. capacity():重新分配内存之前,string对象能包含的最大字符数————————————————
版权声明:本文为CSDN博主「YAIMZA」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37941471/article/details/82107077

3.string的插入:push_back() 和 insert()

1. push_back(): 尾插一个字符
2. insert(pos,char):在制定的位置pos前插入字符char

4.string拼接字符串:append() & + 操作符

// 方法一:append()string s1("abc");s1.append("def");cout<<"s1:"<<s1<<endl; // s1:abcdef// 方法二:+ 操作符string s2 = "abc";/*s2 += "def";*/string s3 = "def";s2 += s3.c_str();cout<<"s2:"<<s2<<endl; // s2:abcdef————————————————
版权声明:本文为CSDN博主「YAIMZA」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37941471/article/details/82107077

5.string的删除:erase()

1. iterator erase(iterator p);//删除字符串中p所指的字符2. iterator erase(iterator first, iterator last);//删除字符串中迭代器区间[first,last)上所有字符3. string& erase(size_t pos = 0, size_t len = npos);//删除字符串中从索引位置pos开始的len个字符4. void clear();//删除字符串中所有字符————————————————
版权声明:本文为CSDN博主「YAIMZA」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37941471/article/details/82107077

其实还有很多很重要的,比如遍历啊,删除啊,查找啊,替换啊之类的功能
这些还是自信观看YAIMZA大佬文章吧,我就不充当搬运工了。。。(主要还是拿别人的劳动成果心虚。。。)
那好,下面就是自己的劳动成果了:

3)我的实现构想


这里可能会略显复杂,希望有大佬能帮忙简化算法。

#include <iostream>
#include <string>
using namespace std;string solution(int number);int main()
{int numble;cin >> numble;cout << solution(numble);return 0;
}string solution(int number){string str;int i=0;while (number >= 1000){str.push_back('M');number -= 1000;i++;}if (number >= 900) {str.insert(str.begin() + i - 1, 'C');number -= 900;i++;}else if( number >= 500 ){str.push_back('D');number -= 500;i++;} else if (number >= 400 ){str.push_back('C');str.push_back('D');number -= 400;i += 2;}while (number >= 100){str.push_back('C');number -= 100;i++;}if (number >= 90) {str.insert(str.begin() + i - 1, 'X');number -= 90;i ++;}else if( number >= 50 ){str.push_back('L');number -= 50;i ++;} else if (number >= 40 ){str.push_back('X');str.push_back('L');number -= 40;i += 2;}while (number >= 10){str.push_back('X');number -= 10;i++;}if (number >= 9) {str.insert(str.begin() + i - 1, 'X');number -= 9;i ++;}else if( number >= 5 ){str.push_back('V');number -= 5;i ++;} else if (number >= 4 ){str.push_back('I');str.push_back('V');number -= 4;i += 2;}while (number >= 1){str.push_back('I');number -= 1;i++;}return str;
}

然后我们就遇到了BUG,就是如果开始时就在1000~900之间,那么在没有M的前提下,就不能插入C,所以我们要适当改进。
我们发现自己的逻辑出现了问题,其实不需要再M前插入C,在1000~900间,只要打印CM即可了。所以更新代码如下:

#include <string>
string solution(int number){string str;int i=0;while (number >= 1000){str.push_back('M');number -= 1000;i++;}if (number >= 900) {str.push_back('C');str.push_back('M');number -= 900;i+=2;}else if( number >= 500 ){str.push_back('D');number -= 500;i++;} else if (number >= 400 ){str.push_back('C');str.push_back('D');number -= 400;i += 2;}while (number >= 100){str.push_back('C');number -= 100;i++;}if (number >= 90) {str.push_back('X');str.push_back('C');number -= 90;i ++;}else if( number >= 50 ){str.push_back('L');number -= 50;i ++;} else if (number >= 40 ){str.push_back('X');str.push_back('L');number -= 40;i += 2;}while (number >= 10){str.push_back('X');number -= 10;i++;}if (number >= 9) {str.push_back('I');str.push_back('X');number -= 9;i ++;}else if( number >= 5 ){str.push_back('V');number -= 5;i ++;} else if (number >= 4 ){str.push_back('I');str.push_back('V');number -= 4;i += 2;}while (number >= 1){str.push_back('I');number -= 1;i++;}return str;
}

又是再一次喜闻乐见的通过,这次因为深夜肝稿导致自己的逻辑思维有点混乱,请不要在意,。萌新嘛,还是各位多多海涵了。

Codewars一些积累No.3 从罗马数字编码器来初探string的实用用法相关推荐

  1. 全能编码器Mencoder(mencoder.exe)命令行用法

    MEncoder 是一个简单的影片编码程序,它可用于将视频或者音频文件在 MPlayer 可播放的格式当中互相转换.说到 MEncoder 就不得不知道 MPlayer.MPlayer 是一款为 Li ...

  2. LeetCode 11盛水最多的容器12整数转罗马数字

    目录 盛水最多的容器 题目描述 分析 整数转罗马数字 题目描述: 分析 结语 盛水最多的容器 公众号:bigsai,回复进群加入打卡,回复bigsai获取3GB的pdf资源.点赞再看,养成习惯! 题目 ...

  3. LeetCode 12/13 罗马数字与整型互转(哈希,贪心)

    文章目录 1. 罗马数字转整型 解题 2. 整数转罗马数字 解题 1. 罗马数字转整型 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M.字符 数值 I 1 V 5 X 10 L 50 ...

  4. 【译】图上的深度学习综述 五、图自编码器

    Deep Learning on Graphs: A Survey Arxiv 1812.04202 自编码器(AE)及其变体被广泛用于无监督学习 [74],它适用于学习没有监督信息的图节点表示. 在 ...

  5. 无需电脑的多平台推流编码器

    本文链接:https://blog.csdn.net/weixin_45326556/article/details/105890355 无需电脑的多平台推流编码器 1. 多平台推流需求 2. 软件方 ...

  6. 罗马数字与阿拉伯数字互转

    来源于 LeetCode Roman to Integer 描述: Given a roman numeral, convert it to an integer. Input is guarante ...

  7. 对于抖音关闭OBS的解决方案之基于海思方案的NDI编码器和解码器使用方法

    对于抖音关闭OBS终于有个临时的解决方案了,但这个方案还是要求主播有权限使用电脑开播,现在开始介绍NDI接入方法,如果还是有不明白的请留言. 参考连接: https://blog.csdn.net/w ...

  8. ffmpeg转码常用容器、编码格式与解编码器的搭配总结,-c与-f参数的运用

    转码 现今常用的一些编码格式以及它们所支持的容器格式如下: 特别提一点,mkv是个万能的容器格式,下面说的所有编码格式,mkv几乎都能"装",就不再列出了. 视频编码格式: h26 ...

  9. 基于海思方案的NDI编码器和解码器使用方法

    本文镜像:https://www.linkpi.cn/archives/356 本文链接:https://blog.csdn.net/weixin_45326556/article/details/1 ...

最新文章

  1. java jar 是什么文件_jar文件怎么打开?jar文件是什么?
  2. django为什么需要子进程,如何关闭子进程,linux状态
  3. webService学习4:客户端调用服务端的代码
  4. Solution for Lead OPA test error ( add button clicked after cancel button )
  5. [unity3d]手游资源热更新策略探讨
  6. createprocess失败代码2_pytest文档57单元测试代码覆盖率(pytestcov)
  7. Python:我可以使用类变量作为线程锁吗?
  8. Nginx的反向代理的配置
  9. 开源:快速升级 B 站账号等级的懒人工具
  10. java开发spc分析软件,SPC、五大工具带你深入实战......OMG,收藏!
  11. 8月SCISSCI期刊目录已更新,警惕这7本期刊
  12. 计算机老显示错误内存不足,电脑老是显示内存不足怎么办
  13. 计算机远程桌面连接有几种方式,远程桌面连接的2种方法
  14. 微信开发者工具下载及调试
  15. 基于微信小程序云开发的投票小程序源码,图文投票微信小程序源码
  16. oracle取日期6,Oracle通过日期获取星座函数
  17. mysql命令行界面出现问题,MySQL命令行界面中出现字符错误提示的原因及解决方法...
  18. python爬取智联招聘职位信息(单进程)
  19. Cookie&Session
  20. Leetcode 猜字谜

热门文章

  1. 20 Rest高级客户端实践(六):搜索入门和基本API介绍
  2. win7桌面右下角提示副本不是正版怎么办?
  3. matlab对音频混响,求助啊 音乐回响 混响
  4. 重大虎溪以南到底有些什么?
  5. xp怎样修改计算机mac地址,xp操作系统网卡mac地址的修改方法
  6. 电子杂志缺乏用户粘性 资本纷纷撤离战场
  7. Quartus II无法打开
  8. 知名歌手育有私生子,非婚生子女权益如何保护?
  9. DHT算法的一知半解
  10. 美赞臣EDI 940仓库装运订单详解