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;
}
}
结果如下: