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 1 V 5 X 10 L 50 C 100 D 500 M 1000

这里,我们只介绍一下1000以内的数字的表示法。

单个符号重复多少次,就表示多少倍。最多重复3次。比如:CCC表示300 XX表示20,但150并不用LLL表示,这个规则仅适用于I X C M。

如果相邻级别的大单位在右,小单位在左,表示大单位中扣除小单位。比如:IX表示9 IV表示4 XL表示40
更多的示例参见下表,你找到规律了吗

本题目的要求是:请编写程序,由用户输入若干个罗马数字串,程序输出对应的十进制表示。

输入格式是:第一行是整数n,表示接下来有n个罗马数字(n<100)。以后每行一个罗马数字。罗马数字大小不超过999。

要求程序输出n行,就是罗马数字对应的十进制数据。
 例如,用户输入:
  3   LXXX   XCIII   DCCII

则程序应该输出:   80   93   702

#include<stdio.h>
#include<string.h>
int LuoMa(char *s){
	int num = 0;
	int i=0;
	int sum = strlen(s);
		for(i=0;i<sum;i++){
	
	if(s[i]=='I')
			num+=1;
		else if(s[i]=='V'){
			if(i>0&&s[i-1]=='I')
				num+=5-1-1;//因为之前已经加过1啦
			else 
				num+=5;
		}
	
	else if(s[i]=='X'){
			if(i>0&&s[i-1]=='I')
				num+=10-1-1;
			else if(i>0&&s[i-1]=='V')
				num+=10-5-5;
			else
				num+=10;
		}
	
	else if(s[i]=='L'){
			if(i>0&&s[i-1]=='I')
				num+=50-1-1;
			else if(i>0&&s[i-1]=='V')
				num+=50-5-5;
			else if(i>0&&s[i-1]=='X')
				num+=50-10-10;
			else
				num+=50;
		}
	
	else if(s[i]=='C'){
			if(i>0&&s[i-1]=='I')
				num+=100-1-1;
			else if(i>0&&s[i-1]=='V')
				num+=100-5-5;
			else if(i>0&&s[i-1]=='X')
				num+=100-10-10;
			else if(i>0&&s[i-1]=='L')
				num+=100-50-50;
			else
				num+=100;
		}
		
		else if(s[i]=='D'){
			if(i>0&&s[i-1]=='I')
				num+=500-1-1;
			else if(i>0&&s[i-1]=='V')
				num+=500-5-5;
			else if(i>0&&s[i-1]=='X')
				num+=500-10-10;
			else if(i>0&&s[i-1]=='L')
				num+=500-50-50;
			else if(i>0&&s[i-1]=='C')
				num+=500-100-100;
			else
				num+=500;
		}
		
		else if(s[i]=='M'){
			if(i>0&&s[i-1]=='I')
				num+=1000-1-1;
			else if(i>0&&s[i-1]=='V')
				num+=1000-5-5;
			else if(i>0&&s[i-1]=='X')
				num+=1000-10-10;
			else if(i>0&&s[i-1]=='L')
				num+=1000-50-50;
			else if(i>0&&s[i-1]=='C')
				num+=1000-100-100;
			else if(i>0&&s[i-1]=='C')
				num+=1000-100-100;
			else if(i>0&&s[i-1]=='D')
				num+=1000-500-500;
			else
				num+=500;
		}
		
		}
		return num;
}
int main(){
	int n;
	char s[100];
	int sum;
	int i;
	int length;
	int j=0;
	scanf("%d",&n);
	for(i=0;i<n;i++){
		scanf("%s",s);
		sum = LuoMa(s);
		printf("罗马数字为:%d\n",sum);
	}
	

	return 0;
}

在这里插入图片描述
另一种解法,利用数组

#include<stdio.h>
#include<string.h>
int main(){
	int i,j;
	int n;
	char s[100];
	int num[7]={1,5,10,50,100,500,1000};
	int line[7];//记录输入罗马符的下标
	//char LuoMa[]="IVXLCDM";
	char LuoMa[7]={'I','V','X','L','C','D','M'};
	int LuoMaNum=0;
	int k=0,sum,g;
	scanf("%d",&n);
	for(i=0;i<n;i++){
		scanf("%s",&s);
		int jea=strlen(s);
		for( sum=0;sum < jea;sum++){
		for(j=0;j<7;j++)
			
			if(s[sum]==LuoMa[j]){
				line[k++]=j;
				break;
			}
		}
		
		for(g=0;g<k-1;){
			if(line[g]>line[g+1]){
				LuoMaNum+=num[line[g]];
				g++;
			}
			else if(line[g]<line[g+1]){
				LuoMaNum+=num[line[g+1]]-num[line[g]];
				g+=2;
			}
			else if(line[g]==line[g+1]){
				LuoMaNum+=num[line[g]];
				g++;
			}

		}
		if(g<k)
				LuoMaNum+=num[line[g]];
		k=0;
		printf("%d\n",LuoMaNum);
		LuoMaNum=0;
	}
	return 0;
}

在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-01-14 01:47:11  更:2022-01-14 01:49:34 
 
开发: 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:01:14-

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