博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
<每日 1 OJ> -LeetCode 13 . 罗马数字转正数
阅读量:5294 次
发布时间:2019-06-14

本文共 2334 字,大约阅读时间需要 7 分钟。

题目:

罗马数字包含以下七种字符: 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。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。

示例 1:

输入: "III"

输出: 3
示例 2:

输入: "IV"

输出: 4
示例 3:

输入: "IX"

输出: 9
示例 4:

输入: "LVIII"

输出: 58
解释: L = 50, V= 5, III = 3.
示例 5:

输入: "MCMXCIV"

输出: 1994
解释: M = 1000, CM = 900, XC = 90, IV = 4.

 

思路如下:

每次顺序读取两个值,前一个比后面小的话,就说明出现了那六种情况,也就是需要用后一个值减去前一个值。比如:

s="IV";

此时,V-I即可的到值,反之,如果前一个值大于后一个值,那么,正常读取当前值即可

代码:

/ 13.罗马数字转整数.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include "stdlib.h"int read(char a);int romantoint(char *s);int read(char a){    switch (a){        case 'I': return 1;        case 'V': return 5;        case 'X': return 10;        case 'L': return 50;        case 'C': return 100;        case 'D': return 500;        case 'M': return 1000;        default:  printf("Input Error!\n");                  return 0;    }}int romantoint(char *s){    int len = 0;    int pos = 0;    int sum = 0;    int next = 0;    for(len = 0;s[len]!='\0';len++);    while(pos != len){        printf("pos:%d\n",pos);        if(s[pos+1] != '\0'){            if(read(s[pos+1])>read(s[pos])){                next = read(s[pos+1])-read(s[pos]);                pos += 2;                sum += next;                continue;            }        }        next = read(s[pos]);        pos ++;        sum += next;    }    return sum;}int _tmain(int argc, _TCHAR* argv[]){       char *str = (char*)malloc(100);    // char *str = NULL;  错误的用法    scanf("%s",str);    int num =romantoint(str);    printf("%d",num);    system("pause");           return 0;}

注意1  :

str是一个字符指针,你没有为它申请空间就是用,自然会出错。改正:

char *str = (char*)malloc(100);
scanf("%s",str);
printf("输出输入的字符串*str=%s\n",str);

注意2  :

初始化:定义了一个数组,在编译时为他分配内存单元,他有确定的地址;而在定义一个字符指针变量时,最好将其初始化,否则指针变量的值会指向一个不确定的内存段,将会破坏程序,

以下方式是允许的:

char str[10];

scanf("%s", str); //或使用字符串拷贝函数进行拷贝赋值

以下方式不推荐,是很危险的:

char *p; //指针变量未初始化,指向一个不确定的内存段

scanf("%s", p);

以下方式是推荐使用的:

p = (char *)malloc(10);

scanf("%s", p); //或使用字符串拷贝函数进行拷贝赋值

 

转载于:https://www.cnblogs.com/mhq-martin/p/11374662.html

你可能感兴趣的文章
基础类型
查看>>
属性动画
查看>>
标识符
查看>>
Swift 常量&变量
查看>>
Sqli labs系列-less-4 这关好坑!!!
查看>>
路由跟踪工具0trace
查看>>
给大家分享一张CSS选择器优选级图谱 !
查看>>
Win7中不能调试windows service
查看>>
T-SQL触发器,限制一次只能删除一条数据
查看>>
boost库使用:vs2013下boost::container::vector编译出错解决
查看>>
通过httplib2 探索的学习的最佳方式
查看>>
理解运算符重载 4
查看>>
快来熟练使用 Mac 编程
查看>>
第二周
查看>>
断言简介
查看>>
Node.js 入门:Express + Mongoose 基础使用
查看>>
plsql使用,为什么可以能看见其他用户的表
查看>>
一步步教你轻松学奇异值分解SVD降维算法
查看>>
Scripting Java #3:Groovy与invokedynamic
查看>>
2014-04-21-阿里巴巴暑期实习-后台研发-二面经验
查看>>