蓝桥杯专题-真题版含答案-【罗马数字转十进制】【身份证校验】【四方定理】【Excel地址转换】

Unity3D特效百例 案例项目实战源码 Android-Unity实战问题汇总
游戏脚本-辅助自动化 Android控件全解手册 再战Android系列
Scratch编程案例 软考全系列 Unity3D学习专栏
蓝桥系列 ChatGPT和AIGC

关于作者

专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等)
有什么需要欢迎底部卡片私我,获取更多支持,交流让学习不再孤单

CSDN-芝麻粒儿

实践过程

罗马数字转十进制

古罗马帝国开创了辉煌的人类文明,但他们的数字表示法的确有些繁琐,尤其在表示大数的时候,
现在看起来简直不能忍受,所以在现代很少使用了。之所以这样,不是因为发明表示法的人的智力的问题,
而是因为一个宗教的原因,当时的宗教禁止在数字中出现0的概念!
罗马数字的表示主要依赖以下几个基本符号:
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 更多的示例参见下表,你找到规律了吗?
I,1
II,2
III,3
IV,4
V,5
VI,6
VII,7
VIII,8
IX,9

X,10
XI,11
XII,12
XIII,13
XIV,14
XV,15
XVI,16
XVII,17
XVIII,18
XIX,19
XX,20
XXI,21
XXII,22
XXIX,29
XXX,30
XXXIV,34
XXXV,35
XXXIX,39
XL,40
L,50
LI,51
LV,55
LX,60
LXV,65
LXXX,80
XC,90
XCIII,93
XCV,95
XCVIII,98
XCIX,99

C,100
CC,200
CCC,300
CD,400
D,500
DC,600
DCC,700
DCCC,800
CM,900
CMXCIX,999
本题目的要求是:请编写程序,由用户输入若干个罗马数字串,程序输出对应的十进制表示。
输入格式是:第一行是整数n,表示接下来有n个罗马数字(n<100)。
以后每行一个罗马数字。 罗马数字大小不超过999。
要求程序输出n行,就是罗马数字对应的十进制数据。
例如,用户输入:
3
LXXX
XCIII
DCCII
则程序应该输出:
80
93
702

import java.util.Scanner;  
  
public class 罗马数字转十进制 {  
    public static int getNum(char c){  
        switch(c){  
        case 'I': return 1;  
        case 'V': return 5;  
        case 'X': return 10;  
        case 'L': return 50;  
        case 'C': return 100;  
        case 'D': return 500;  
        case 'M': return 1000;  
        }  
        return 0;  
    }  
    public static int format(String s){  
        int sum = 0;    // 总和   
        for(int i=0;i<s.length();i++){  
            int a,b;    // 取得两个相邻的两个值   
            a = getNum(s.charAt(i));  
            if(i+1<s.length()){  
                b = getNum(s.charAt(i+1));  
            }else{  
                b = 0;  
            }  
            if(a<b){ // 对比两个值   
                sum += b-a; // 前小后大时,sum=大-小   
                i++;    // 这里的i++和(for里的i++) i 会后移两位 ,再次进行   
            }else{  
                // 前大后小,或者相等时, sum = 前大元素  , 上边的(for里的i++) i 会后移一位   
                sum += a;  
            }  
        }  
        return sum;  
    }  
    public static void main(String[] args){  
        Scanner scan = new Scanner(System.in);  
        System.out.println("输入整数n,表示接下来有n个罗马数字(n<100)");  
        int n = scan.nextInt();  
        String[] s = new String[n];  
        scan.nextLine();  
        for(int i=0;i<n;i++){    // 输入数据   
            s[i] = scan.nextLine();  
        }  
        for(int i=0;i<s.length;i++){ // 格式化并输出   
            System.out.println(format(s[i]));  
        }  
    }  
}

身份证校验

如果让你设计个程序,用什么变量保存身份证号码呢?长整数可以吗?不可以!
因为有人的身份证最后一位是"X"
实际上,除了最后一位的X,不会出现其它字母!
身份证号码18位 = 17位 + 校验码
校验码的计算过程:
例如:身份证前17位 = ABCDEFGHIJKLMNOPQ
A~Q 每位数字乘以权值求和(每位数字和它对应的“权”相乘后累加)
17位对应的权值分别是:
7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
求出的总和再对11求模
然后按下表映射:
余数 0 1 2 3 4 5 6 7 8 9 10
校验码: 1 0 X 9 8 7 6 5 4 3 2
下面的代码实现了校验过程,输入串为身份证前17位,打印出校验码。

import java.util.Scanner;  
  
public class 身份证校验 {  
    public static char verifyCode(char[] s){  
        int weight[] = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};  
        char map[] = {'1','0','X','9','8','7','6','5','4','3','2'};  
  
        int sum = 0;  
        for(int i=0; i<17; i++){  
            sum += (s[i]-'0') * weight[i];  // 填空   
        }  
        return map[sum%11];  // 填空   
    }  
    public static void main(String[] args) {  
        Scanner scan = new Scanner(System.in);  
        System.out.println("输入\" 17位   \"数字(通过身份证前17位,得到最后一位校验码)");  
        String s = scan.nextLine();  
        char[] c = s.toCharArray();  
        System.out.println(verifyCode(c));  
    }  
}  

运行结果:
输入" 17位   "数字(通过身份证前17,得到最后一位校验码)  
41104219891216164  
9

四方定理

数论中有著名的四方定理:所有自然数至多只要用四个数的平方和就可以表示。
我们可以通过计算机验证其在有限范围的正确性。
对于大数,简单的循环嵌套是不适宜的。下面的代码给出了一种分解方案。

import java.util.Scanner;  
  
public class 四方定理 {  
    public static int f(int n, int a[], int idx) {  
        if (n==0) // 填空1   
            return 1;  
        if (idx == 4)  
            return 0;  
  
        for (int i = (int) Math.sqrt(n); i >= 1; i--) {  
            a[idx] = i;  
  
            if (f(n-i*i, a, idx+1) == 1) // 填空2   
                return 1;  
        }  
        return 0;  
    }  
    public static void main(String[] args) {  
        Scanner scan = new Scanner(System.in);  
        for (;;) {  
            int number;  
            System.out.printf("输入整数(1~10亿):");  
            number = scan.nextInt();  
            int a[] = { 0, 0, 0, 0 };  
            int r = f(number, a, 0);  
            System.out.printf("%s: %d %d %d %d\n", r==1?"有结果":"无结果", a[0], a[1], a[2], a[3]);  
        }  
    }  
} 
运行结果:
输入整数(1~10亿)234  
有结果: 15 3 0 0  
输入整数(1~10亿)4  
有结果: 2 0 0 0  
输入整数(1~10亿)0  
有结果: 0 0 0 0  
输入整数(1~10亿)-1  
无结果: 0 0 0 0  
输入整数(1~10亿)

Excel地址转换

Excel是最常用的办公软件。每个单元格都有唯一的地址表示。比如:第12行第4列表示为:“D12”,第5行第255列表示为“IU5”(26进制)。
事实上,Excel提供了两种地址表示方法,还有一种表示法叫做RC格式地址。
第12行第4列表示为:“R12C4”,第5行第255列表示为“R5C255”。
你的任务是:编写程序,实现从RC地址格式到常规地址格式的转换。
【输入、输出格式要求】
用户先输入一个整数n(n<100),表示接下来有n行输入数据。
接着输入的n行数据是RC格式的Excel单元格地址表示法。
程序则输出n行数据,每行是转换后的常规地址表示法。
例如:用户输入:
2
R12C4
R5C255
则程序应该输出:
D12
IU5

package Question1_9;
import java.util.Scanner;
import java.util.Stack;
import java.util.Vector;
public class Question4 {
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		int n=scanner.nextInt();
		scanner.nextLine();  //必须加上的,不然会导致输入不准确!
		while (n>0) {
			String string=scanner.nextLine();
			String strings[]=string.split("C");
			strings[0]=strings[0].substring(1, strings[0].length());
			int hangshu=Integer.parseInt(strings[0]),lieshu=Integer.parseInt(strings[1]);//获取行数和列数
			/*
			 * 对列数进行变换
			 */
			Stack<Character>stack=new Stack<Character>();
			while(lieshu>0){
				if(lieshu%26==0){
					stack.push('Z');
					lieshu=lieshu/26-1;
				}else {
					stack.push((char)('A'-1+lieshu%26));
					lieshu=lieshu/26;
				}
			}
			while (!stack.empty()) {
				System.out.print(stack.pop());
			}
			System.out.println(hangshu);
			n--;
		}
	}
}
运行结果:
输入一个整数n(n<1002
R12C4
R5C255
D12
IU5

其他

作者:小空和小芝中的小空
转载说明-务必注明来源:https://zhima.blog.csdn.net/
这位道友请留步☁️,我观你气度不凡,谈吐间隐隐有王者霸气,日后定有一番大作为!!!旁边有点赞收藏今日传你,点了吧,未来你成功☀️,我分文不取,若不成功⚡️,也好回来找我。

温馨提示点击下方卡片获取更多意想不到的资源。
空名先生

你可能感兴趣的:(蓝桥全系列,蓝桥杯,excel,职场和发展,算法,真题)