暴力破解———罗马数字逆向解法,猜年龄利用位数信息,罗马数字的枚举解法

1.罗马数字逆向解法

输入一个1到4000不包含4000的整数,将其转换成罗马数字

罗马数字规则:
            I(1)、V(5)、X(10)、L(50)、C(100)、D(500)、 M(1000))

但特殊的是,每一位的四和九是特殊的:

4:IV   9: IX  40: XL 90: XC  400:  CD  900 : CM 

不难发现其实就是后面的减去前面的

然后通过

        num / 1000;
        num % 1000  / 100;
        num  % 100 / 10;
        num /1000;

分别求出千位,百位,十位,个位的数。

最后通过枚举得出结论

代码如下:

import java.util.*;
public class Test1 
{
	public static void main(String[] args) 
	{
		Scanner input = new Scanner(System.in);
		System.out.println("请输入一个介于0-4000的整数");
		int num = input.nextInt();
		System.out.println(NumTORoman(num));
	}
	
	public static String NumTORoman(int num) 
	{
		int a = num / 1000;
		int b = num % 1000  / 100;
		int c = num  % 100 / 10;
		int d = num /1000;
		String s = "";
		/*罗马数字规则:
			I(1)、V(5)、X(10)、L(50)、C(100)、D(500)、 M(1000))
		 */
		if(num >  0 && num < 4000) 
		{
			//千位
			if(a == 1) s+="M";
			if(a == 2) s+="MM";
			if(a == 3) s+="MMM";
			//百位
			if(b == 1) s+="C";
			if(b == 2) s+="CC";
			if(b == 3) s+="CCC";
			if(b == 4) s+="CD";
			if(b == 5) s+="D";
			if(b == 6) s+="DC";
			if(b == 7) s+="DCC";
			if(b == 8) s+="DCCC";
			if(b == 9) s+="CM";
			//十位
			if(c == 1) s+="X";
			if(c == 2) s+="XX";
			if(c == 3) s+="XXX";
			if(c == 4) s+="XL";
			if(c == 5) s+="L";
			if(c == 6) s+="LX";
			if(c == 7) s+="LXX";
			if(c == 8) s+="LXXX";
			if(c == 9) s+="XC";
			//个位
			if(d == 1) s+="I";
			if(d == 2) s+="II";
			if(d == 3) s+="III";
			if(d == 4) s+="IV";
			if(d == 5) s+="V";
			if(d == 6) s+="VI";
			if(d == 7) s+="VII";
			if(d == 8) s+="VIII";
			if(d == 9) s+="IX";
		}
		return s;
	}
}

结果如下:

2.猜年龄利用位数信息

美国数学家维纳(N.Wiener)智力早熟,11岁就上了大学。他曾在1935~1936年应邀来中国清华大学讲学。一次,他参加某个重要会议,年轻的脸孔引人注目。于是有人询问他的年龄,他回答说:“我年龄的立方是个4位数。
我年龄的4次方是个6位数。这10个数字正好包含了从0到9这10个数字,每个都恰好出现1次。”
请你推算一下,他当时到底有多年轻

先求出年龄的立方,再求出四次方,然后根据条件删除不符合条件的信息,最后将符合条件的信息列举出来

代码如下:

public class Test2 
{
	public static void main(String[] args) 
	{
		for (int i = 1;i < 100 ;i++) 
		{
			int a = i*i*i;
			int b = a*i;
			if((a+"").length()!=4) continue;
			if((b+"").length()!=6) continue;
			System.out.println(i + "=" + a + b);
		}
	}
}

结果如下:

很直观的可以看出是18岁

3. 罗马数字的枚举解法

古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在示大数的时候,现在看起来简直不能忍受,所以在现代很少使用了。之所以这样,不是因为发明表示法的人的智力的问题,而是因为一个宗教的原因,当时的宗教禁止在数字中出现 0 的概念!

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

输入格式是:第一行是整数 n,表示接下来有 n 个罗马数字(n<100)。 以后每行一个罗马数字。罗马数字大小不超过 999。
要求程序输出 n 行,就是罗马数字对应的十进制数据。

例如,用户输入:
3
LXXX
XCIII
DCCII
则程序应该输出:
80
93
702

代码如下:

import java.util.*;
public class Test3 
{
	public static void main(String[] args) 
	{
		Scanner input = new Scanner(System.in);
		System.out.println("请输入行数和罗马数字:");
		int num = input.nextInt();
		String a[] = new String [num];
		for(int i = 0;i < a.length;i++) 
		{
			a[i] = input.next();
		}
		for(int i = 0;i < a.length;i++) 
		{
			System.out.println(RomanToNum(a[i]));
		}
		
	}
	 static int RomanToNum(String s) 
	{
		int sum = 0;
		for(int i = 0;i <s.length();i++) 
		{
			char c = s.charAt(i);
			if (c == 'I') sum += 1;
			if (c == 'V') sum += 5;
			if (c == 'X') sum += 10;
			if (c == 'L') sum += 50;
			if (c == 'C') sum += 100;
			if (c == 'D') sum += 500;
			if (c == 'M') sum += 1000;
		}
		return sum;
	}
}

结果如下:

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

差劲的厉害了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值