将一个罗马数转化成对应的阿拉伯数

阿拉伯数,顾名思义 ,就是我们平时使用最多的数,比如,1,2,3,4,.....

罗马数,是数字最早的表示方式。基本的字符有:I、V、X、L、C、D、M,对应的数字

分别是:1,5,10,50,100,500,1000。

下边给出罗马数的计数规律:

1.两个相同的字符挨着写,表示相加。比如:XX转化成阿拉伯数就是20.

2.如果一个字符表示的数比左边的字符表示的数大,则转化成阿拉伯数就是这个数减去

左边的数。

比如:IX表示的阿拉伯数就是10-1 = 9.

ICMI表示的阿拉伯数是:1000-(IC)+I = 1000-(100-1)+1 = 902.

转化的时候必须先找出给出的罗马数中的最大的字符。

下边给出代码:

#include<stdio.h>
#include<string.h>
#include<assert.h>
#define N 7
char digit[N] = {'I','V','X','L','C','D','M'};
int values[N] = { 1,  5, 10, 50, 100,500,1000 };

int digitToValue(char ch)//字符转化成相应的阿拉伯数
{
	int i = 0;
	for (i = 0;i < N; i++)
	{
		if (digit[i] == ch)
			return values[i];
	}
	return 0;
}
int findMaxIndex(char str[], int L, int R)//找最大字符的下标
{
	assert(L >= 0 &&R >= 0);
	int i = 0;
	int max = digitToValue(str[L]);
	int maxIndex = L;
	for (i = L+1;i <= R;i++)
	{
		int tmp = digitToValue(str[i]);//将字母转为对应的数字
		if (tmp > max)
		{
			max = tmp;
			maxIndex = i;
		}
	}
	return maxIndex;
}
int romenToNumber(char str[],int L,int R)//转化函数
{
	if (L == R)
	{
		return digitToValue(str[L]);
	}
	else if (L > R)
	{
		return 0;
	}
	else
	{
		int maxIndex = findMaxIndex(str, L, R);
		int left = romenToNumber(str, L, maxIndex - 1);
		int right = romenToNumber(str,maxIndex + 1, R);
		int num = digitToValue(str[maxIndex]);
		return num - left + right;
	}
}
int main()
{
	char str[] = "IMCCI";
	int r = romenToNumber(str,0,4);
	printf("%d",r);
	system("pause");
	return 0;
}

实现部分是采用递归做的。找出这个数字的最大字符,然后用递归的方法求出左边

的数,然后再求出右边的数。将罗马数的几个计数字符定义成全局变量,方便

digitToValue函数查找。

时间: 2024-10-03 21:41:23

将一个罗马数转化成对应的阿拉伯数的相关文章

C#- 将秒数转化成任意时间格式

将秒数转化成任意时间格式,可以使用C#的一个函数TimeSpan,看示例: TimeSpan ts = new TimeSpan(0, 0, 3661); richTextBox2.Text = ts.Hours + "小时" + ts.Minutes + "分钟" + ts.Seconds + "秒"; 也可以使用传统的方法,看示例:   int TotleTime=3661;//秒         int hour;         int

计算十进制数转化成二进制时1的个数

#include <iostream> using namespace std; int func(int x) { int cnt = 0; while (x) { cnt++; x = x&(x - 1); } return cnt; } int main() { cout << func(9999) << endl << func(8); cin.get(); return 0; } 输出8,1 其实上面那个函数输出结果是:形参x转化为二进制后

有序数组转化成二叉搜索数

今天在网上看到一家公司的笔试题: 这里就不带大家看概念了,什么是二叉搜索树? 下面直接看代码 1 //an order arr to binary search tree 2 (function(){ 3 function main(arr){ 4 var node = {}; 5 if(arr.length <= 1) 6 return {data:arr[0]}; 7 var flag = Math.floor(arr.length/2); 8 node.data = arr[flag];

把自1970年1月1日以来的秒数转化成年月日

#include <iostream> using namespace std; bool IsRound(int year){  if((year%100)&&(year%4==0)) return 1;  if((year%100==0)&&(year%400==0)) return 1;  return 0; } int main() {  int n;  int year_s[2]= {365*24*60*60, 366*24*60*60};  int 

C语言-对字符串二维数组各个元素进行比较-十进制数转化为其他进制数-进行规则矩阵的输出-190225

//编写一个函数:从传入的num个字符中找到最长的一个字符,并通过max传回该串地址. //重点:切记这里a[0]就是一个地址. 1 #include<conio.h> 2 #include<stdio.h> 3 #include<string.h> 4 #include<stdlib.h> 5 6 char *fun(char (*a)[81], int num, char *max) 7 { 8 max = a[0];//切记这里a[0]就是一个地址.

递归 将一个十进制数转化为任意进制字符串

Create All kinds of guns. 设计重点: 1 基类作接口 2 继承类是各种不同的类 3 构建工厂类,然后根据需要创造不同的类,可以传入关键字,或者索引等. #pragma once #include <string> #include <iostream> using namespace std; //Base class class Gun { public: virtual string description() { return "Gener

iOS开发之---将时间戳,转化成时间字符串。

1.将一个NSDate,转化成时间字符串. NSDate *date = [NSDate date]; NSDateFormatter *fmt = [[NSDateFormatter alloc] init]; fmt.dateFormat = @"yyyy-MM-dd"; NSString *dateStr = [fmt stringFromDate:date];

UVA 11054 The Necklace 转化成欧拉回路

题意比较简单,给你n个项链碎片,每个碎片的两半各有一种颜色,最后要把这n个碎片串成一个项链,要求就是相邻碎片必须是同种颜色挨着. 看了下碎片总共有1000个,颜色有50种,瞬间觉得普通方法是无法在可控时间内做出来的,因为碎片到底放哪里以及是正着放还是反着放都是不可控的. 这个时候数学建模就真的好重要了,如果我们能把颜色作为节点,一个碎片就表示两个节点连了一条路,那其实就是走了一遍欧拉回路,就意味着项链做成了. 太叼了,这个思想真心不错...LRJ书上的提示,否则我还真是想不到可以这样. 不过还有

1、AJAX里面status的值代表什么 2、get post 的区别 3、怎样把对象转化成字符串 4、闭包、继承、原型、原型链 5 、http传输协议 6、arguments是什么

1.AJAX里面status的值代表什么     在JavaScript里面写AJax的时,最关键的一步是对XMLHttpRequest对象建立监听,即使用"onreadystatechange"方法.监听的时候,要对XMLHttpRequest对象的请求状态进行判断,通常是判断readyState的值为4且status的值为200或者304时执行我们需要的操作.以下记录了一些常用readState以及status的值及其含义 readyState 属性表示Ajax请求的当前状态.它的