罗马数字逆向解法(简单的算法暴力破解)

罗马数字逆向解法

题目:输入一个1到4000不包含4000的整数转换成罗马数字

代码如下(示例):

package com.hzc.bluecap;

import java.util.Scanner;

public class RomanNumReverse {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一个[1——4000)的数整数");
		int num=sc.nextInt();
		System.out.println(RomanNum(num));
	}
	
	private static String RomanNum(int num) {
		// TODO Auto-generated method stub
		int m=num/1000;
		int c=num%1000/100;
		int x=num%100/10;
		int a=num%10;
		String s="";
		if(0<num&&num<4000) {
		if(m==1) s+="M";
		if(m==2) s+="MM";
		if(m==3) s+="MMM";
		
		if(c==1) s+="C";
		if(c==2) s+="CC";
		if(c==3) s+="CCC";
		if(c==4) s+="CD";
		if(c==5) s+="D";
		if(c==6) s+="DC";
		if(c==7) s+="DCC";
		if(c==8) s+="DCCC";
		if(c==9) s+="CM";
	
		if(x==1) s+="X";
		if(x==2) s+="XX";
		if(x==3) s+="XXX";
		if(x==4) s+="XL";
		if(x==5) s+="L";
		if(x==6) s+="LX";
		if(x==7) s+="LXX";
		if(x==8) s+="LXXX";
		if(x==9) s+="XC";
		
		if(a==1) s+="I";
		if(a==2) s+="II";
		if(a==3) s+="III";
		if(a==4) s+="IV";
		if(a==5) s+="V";
		if(a==6) s+="VI";
		if(a==7) s+="VII";
		if(a==8) s+="VIII";
		if(a==9) s+="IX";
		return s;	
		}
		return "输入范围有误";
	}

}

思路

我看到题目的第一想法是直接用数组下标表示数值数组存入罗马数值然后经过挣扎发现很难实现于是去B站看原视频发现暴力破解这一好方法,原视频链接: https://www.bilibili.com/video/BV1tt41177mu?p=6.
不想看视频的话下面我把我的想法分步讲解
一.1到3999直接用罗马数字全表示的话实现起来相当困难所以可以逐步分解
再进行配对(罗马数字规则I(1)、V(5)、X(10)、L(50)、C(100)、D(500)、 M(1000))根据将输入数值num除1000可得到千位
同理:num%1000/100可得到百位,num%100/10可得到十位,num/10可得到个位
二.用罗马数字分别表示不同位值1-9例如:千位可表示为M,MM,MMM
百位可表示为C,CC,CCC,CD,D,DC,DCC,DCCC,CM,十位,个位同理
三.创建一个字符串s储存结果在确认输入合法后用判断语句进行对比并进行拼接然后返回s

总结

对于可列举的有限结果题目用合理的暴力破解的办法一般可节约提高效率并减小难度

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
逆向最大匹配算法是一种中文分词算法,它从待分词文本的末尾开始,选择词典中最长的词作为匹配的片段,然后将该片段从文本中移除。这个过程会一直重复,直到文本为空或无法再匹配出词。以下是一个例子来说明逆向最大匹配算法的运行过程。 假设我们有一个待分词的句子: "中文分词是一项重要任务"。我们使用逆向最大匹配算法对其进行分词。 首先,我们从句子的末尾开始,选择词典中最长的词进行匹配。在这个例子中,最长的词是"任务"。我们将"任务"从句子中移除,并将其作为分词结果的一部分。 接下来,我们继续从句子剩余部分的末尾开始匹配,找到词典中最长的词。在这个例子中,剩余的部分是"中文分词是一项重要",最长的词是"重要"。我们将"重要"从剩余部分中移除,并将其作为分词结果的一部分。 最后,我们继续匹配剩余部分的最长词。在这个例子中,剩余的部分是"中文分词是一项",最长的词是"中文"。我们将"中文"从剩余部分中移除,并将其作为分词结果的一部分。 最终,我们得到的分词结果是:"中文"、"分词"、"是"、"一项"、"重要"、"任务"。这个例子展示了逆向最大匹配算法在对句子进行分词时的运行过程。 引用中提到,逆向最大匹配算法虽然简单,但在处理一些语句上不能准确地分词。现在的分词算法通常采用基于统计概率模型的算法,如maxent或CRF等,这些算法在分词效果上比逆向最大匹配算法好。因此,逆向最大匹配算法在现代中文分词中的应用较少。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [逆向最大匹配分词算法](https://blog.csdn.net/crcr/article/details/123979555)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值