【基础练习】【字符串处理】codevs1264 芳香数题解

题目来源 2012CCC加拿大高中信息学奥赛(这个系列基本都是基础练习题,想打好最基础的基础的同学们可以试一试)

题目描述 Description

This question involves calculating the value of aromatic numbers which are a combination of Arabic digits and Roman numerals.

本题是关于计算芳香数数值的问题,芳香数是阿拉伯数字和罗马数字的组合。

An aromatic number is of the form ARARAR...AR, where each A is an Arabic digit, and each R is a Roman numeral. Each pair AR contributes a value described below, and by adding or subtracting these
values together we get the value of the entire aromatic number.

芳香数的格式是ARARAR..ARA,其中A代表阿拉伯数字,R代表罗马数字。每一对AR按照下面的计算方式计算一个值,通过把这些数值加减起来,就得到了整个芳香数的数值。

An Arabic digit A can be 0, 1, 2, 3, 4, 5, 6, 7, 8 or 9. A Roman numeral R is one of the seven letters I, V, X, L, C, D, or M. Each Roman numeral has a base value:

阿拉伯数字是0,1,2..9,罗马数字是I,V,X,L,C,D,M。

Symbol I V X L C D M Base value 1 5 10 50 100 500 1000

符号I V X L C D M的值是1 5 10 50 100 500 1000。

The value of a pair AR is A times the base value of R. Normally, you add up the values of the pairs to get the overall value. However, wherever there are consecutive symbols ARA0R0 with
R0 having a strictly bigger base value than R, the value of pair AR must be subtracted from the total, instead of being added.

一对AR的值计算为A乘以R。一般的,我们把所有的AR的值加起来就得到了芳香数的值。但是如果存在连续的两个数对ARA0R0,其中R0严格大于R的话,则需要减去AR的值,而不是加上。

For example, the number 3M1D2C has the value 3?1000+1?500+2?100 = 3700 and 3X2I4X has the value 3 ? 10 ? 2 ? 1 + 4 ? 10 = 68.

举个例子,3M1D2C 的值为3*1000+1*500+2*100=3700,而3X2I4X的值为3*10-2*1+4*10=68

Write a program that computes the values of aromatic numbers.

你的任务是写一个程序来计算一个给定的芳香数的值。

输入描述 Input Description

The input is a valid aromatic number consisting of between 2 and 20 symbols.

输入是一个合法的芳香数,包含了2-20个字符。

输出描述 Output Description

The output is the decimal value of the given aromatic number.

输出是一个十进制的整数代表这个芳香数的值。

样例输入 Sample Input

样例输入 1: 3M1D2C

样例输入 2: 2I3I2X9V1X

样例输出 Sample Output

样例输出 1: 3700

样例输出 2: -16

这道题目 一看表达式求值 鄙人第一个想到的就是 栈!中毒太深···

本来想写一个stack的代码,但在翻题解的时候发现一段甚是精辟的代码,于是放弃自己写,把代码修改成可以过,贴到这里。

这样的代码,个人以为是很值得学习的。简洁明了,思路清晰,没有冗余代码。赞一个。

关于修改的部分,最主要的是这儿

原代码:

char *d = "IVXLCDM", f[22];

如果这样子的话,高一点版本的编译器会说:

这是因为char *背后的含义是:给我个字符串,我要修改它。而我们给出的初值实际是一个常量,无法修改。如果不需要修改,就写成这个样子:

const char* d= "IVXLCDM";
char f[22];

否则,这个字符串需要修改,那就这样子:

const char  *d;
d = "hello";
d = "good-bye";

经里奥君指点迷津,这里由于是字符串,和一般指针的理解稍有不同。

对于一个指向int的指针t,*t为它指向的东西,可以赋值*t=1,但是t是一个地址,不能t=1(除非1是个地址)

对于一个char* d 如果我们把他理解为一个字符的指针,那么*d就是这个字符,而d是地址

但如果我们把它解释为字符串,字符串的名字是d,*d其实是字符串的第一个位置d[0] 而此时应该写:d=“XXX” 将d所指向的一块存储空间整体填充 就像数组那样

因此我们不能写char *d="XXX"  这就相当于是*d=“XXX”一样 而*d其实相当于是第一个位置,应赋值为一个字符

这就是为什么,读入字符串的时候不需要加& 因为&相当于将一个指针指向的东西赋值为读入的东西,而字符串相当于直接给指针赋值,填充指针代表的空间

这些想法可能有些单纯和幼稚,为了方便理解这样认为。如果有哪位老师知道本质上的原理,请务必告诉我。谢谢。

在这里还要感谢本站博主xyy410874116 您的文章让我受益匪浅

——人生若只如初见,何事秋风悲画扇

时间: 2024-10-01 17:20:05

【基础练习】【字符串处理】codevs1264 芳香数题解的相关文章

1264 芳香数

1264 芳香数 2012年CCC加拿大高中生信息学奥赛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题解 查看运行结果 题目描述 Description This question involves calculating the value of aromatic numbers which are a combination of Arabic digits and Roman numerals. 本题是关于计算芳香数数值的问题,芳香数是阿拉伯数字

SQL 基础之字符串和操作符使用(三)

SQL 基础之字符串使用 : 字符串可以是 SELECT 列表中的一个字符.数字.日期 但日期和字符只能在单引号中出现.每当返回一行时,字符串被输出一次 1.接上文使用过程中如果想把两个列串在一起,并加入一些自定义的显示,如下下图: select first_name || '  is a ' || job_id as "Emp Details" from employees; 2.显示first_name 的人的工资 是多少钱怎么显示: select first_name || '

codecs 1264 芳香数

1264 芳香数 题目描述 Description This question involves calculating the value of aromatic numbers which are a combination of Arabic digits and Roman numerals. 本题是关于计算芳香数数值的问题,芳香数是阿拉伯数字和罗马数字的组合. An aromatic number is of the form ARARAR...AR, where each A is

c#编程基础之字符串函数

c#常用的字符串函数 例一: 获取字符串的大小写函数 ToLower():得到字符串的小写形式 ToUpper():得到字符串的大写形式 注意: 字符串时不可变的,所以这些函数都不会直接改变字符串的内容,而是把修改后的字符串通过函数返回值的形式返回. 源码如下: using System; using System.Collections.Generic; using System.Text; namespace 字符串函数学习 { class Program { static void Mai

获取某个字符串的所有字节数

<script type="text/javascript">        function getBytes(str){            if(!arguments.length || !str)                return null;            if(str.length == '')                return 0;            var len = str.length;            var by

c# 判断字符是否是全角, 获取字符串的字节数 , 获取字符串指定长度字节数的字符串

1 Encoding.Default.GetByteCount(checkString);  =2 全角 =1 半角 /// <summary> /// 获取字符串的字节长度 /// </summary> /// <param name="str"></param> /// <returns></returns> public static int GetStringByteLength(this string s

c#编程基础之字符串基础

1.C#中单个的字符串用单引号包含就是char类型,('a'),单引号中放且只能放一个字符 2.单个字符也可以表示为字符串,还可以有长度为0的字符串. 3.使用s.Length属性来获得字符串中的字符个数. 4.string 可以看做是char类型的只读数组.char c=s[1];例子:遍历输出string中的每个元素. 5.c#中字符串有一个重要的特性:不可变性.字符串一旦声明,就不再可以改变. 所以只能通过索引来读取指定位置的char,不能对指定位置的char进行修改. 6.如果要对cha

redis基础的字符串类型

redis —— 第二篇 基础的字符串类型 我们都知道redis是采用C语言开发,那么在C语言中表示string都是采用char[]数组的,然后你可能会想,那还不简单,当我执行如下命令,肯定是直 接塞给char[]数组的. 如果你真的这么想的话,会有几个问题就要过来砍你了,先我们来找一个redis手册,http://doc.redisfans.com/ 第一:如果你每次都执行Append函数,那是不是redis的char[]每次都需要再次扩容,这样是不是每次都是耗时操作呢? 第二:如果你每次执行

蓝鸥Unity开发基础——使用字符串学习笔记

蓝鸥Unity开发基础使用字符串 本节内容:使用字符串:字符串拼接.转义字符 一.字符串拼接:字符串可以使用+或+=进行字符串拼接!! 二.转移字符--举例\n(表示回车.换行) 转移字符 转义_转义意义 \n_表示换行或回车 \t_表示制表符 \"_表示双引号 \'_表示单引号 \\_表示反斜杠 在字符串前面加@符号,会使字符串的转义字符失效! 字符串中转义字符失效之后,我们需要使用两个双引号来打印双引号 源代码 using System; namespace Lesson08{    cla