蓝桥杯 表格计算 (JAVA模拟 注意细节)
蓝桥杯 表格计算
某次无聊中, atm 发现了一个很老的程序。这个程序的功能类似于 Excel ,它对一个表格进行操作。
不妨设表格有 n 行,每行有 m 个格子。
每个格子的内容可以是一个正整数,也可以是一个公式。
公式包括三种:
1. SUM(x1,y1:x2,y2) 表示求左上角是第 x1 行第 y1 个格子,右下角是第 x2 行第 y2 个格子这个矩形内所有格子的值的和。
2. AVG(x1,y1:x2,y2) 表示求左上角是第 x1 行第 y1 个格子,右下角是第 x2 行第 y2 个格子这个矩形内所有格子的值的平均数。
3. STD(x1,y1:x2,y2) 表示求左上角是第 x1 行第 y1 个格子,右下角是第 x2 行第 y2 个格子这个矩形内所有格子的值的标准差。
标准差即为方差的平方根。
方差就是:每个数据与平均值的差的平方的平均值,用来衡量单个数据离开平均数的程度。
公式都不会出现嵌套。
如果这个格子内是一个数,则这个格子的值等于这个数,否则这个格子的值等于格子公式求值结果。
输入这个表格后,程序会输出每个格子的值。atm 觉得这个程序很好玩,他也想实现一下这个程序。
「输入格式」
第一行两个数 n, m 。
接下来 n 行输入一个表格。每行 m 个由空格隔开的字符串,分别表示对应格子的内容。
输入保证不会出现循环依赖的情况,即不会出现两个格子 a 和 b 使得 a 的值依赖 b 的值且 b 的值依赖 a 的值。
「输出格式」
输出一个表格,共 n 行,每行 m 个保留两位小数的实数。
数据保证不会有格子的值超过 1e6 。
「样例输入」
3 2
1 SUM(2,1:3,1)
2 AVG(1,1:1,2)
SUM(1,1:2,1) STD(1,1:2,2)
「样例输出」
1.00 5.00
2.00 3.00
3.00 1.48
「数据范围」
对于 30% 的数据,满足: n, m <= 5
对于 100% 的数据,满足: n, m <= 50
资源约定:
峰值内存消耗(含虚拟机) < 512M
CPU消耗 < 2000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
题解:这就是一个Java的模拟题 要注意细节。
学到的知识点:
Java中输出double类型保留几位小数的最简便格式为:System.out.printf("%.2f ",val);
string类型的方法中,charAt(index) 传入的是一个下标,意思是将该字符串的index位置变成字符取出。indexOf方法传入一个字符串,找出该字符串中传入字符串的位置。
1 import java.util.Scanner;
2
3 public class Main {
4 static int n,m;
5 static int [] sub(String s) {
6 int [] c = new int [6];
7 for(int i=0;i<c.length;i++)
8 c[i] = 0;
9 c[1] = s.charAt(4)-'0';
10 c[2] = s.charAt(6)-'0';
11 c[3] = s.charAt(8)-'0';
12 c[4] = s.charAt(10)-'0';
13 return c;
14 }
15 static double cal(String string) {
16 int c[] = sub(string);
17 if(string.substring(0, 3).equals("SUM")) {
18 return sum(c);
19 }
20 else if(string.substring(0, 3).equals("STD")) {
21 return std(c);
22 }
23 else
24 return avg(c);
25 }
26 static double sum(int a[]) {
27 double ans = 0;
28
29 for(int i=a[1];i<=a[3];i++) {
30 for(int j=a[2];j<=a[4];j++) {
31 if(s[i][j].charAt(0)<'0'||s[i][j].charAt(0)>'9')
32 ans+=cal(s[i][j]);
33 else
34 ans+=Double.parseDouble(s[i][j]);
35 }
36 }
37 return ans;
38 }
39 static double avg(int a[]) {
40 double ans = sum(a);
41 double cnt = (a[3]-a[1]+1)*(a[4]-a[2]+1);
42 return ans/cnt;
43 }
44 static double std(int a[]) {
45 double ans = 0;
46 double ave = avg(a);
47 double cnt = (a[3]-a[1]+1)*(a[4]-a[2]+1);
48 for(int i=a[1];i<=a[3];i++) {
49 for(int j=a[2];j<=a[4];j++) {
50 if(s[i][j].charAt(0)<'0'||s[i][j].charAt(0)>'9')
51 ans+=(cal(s[i][j])-ave)*(cal(s[i][j])-ave);
52 else
53 ans+=(Double.parseDouble(s[i][j])-ave)*(Double.parseDouble(s[i][j])-ave);
54
55 }
56 }
57 return Math.sqrt(ans/cnt);
58 }
59 static String [][] s = new String [55][55];
60 static double [][] val = new double [55][55];
61 public static void main(String[] args) {
62 Scanner cin = new Scanner(System.in);
63 n = cin.nextInt();
64 m = cin.nextInt();
65 for(int i=1;i<=n;i++) {
66 for(int j=1;j<=m;j++) {
67 String tmp = cin.next();
68 s[i][j] = tmp;
69 }
70 }
71 for(int i=1;i<=n;i++) {
72 for(int j=1;j<=m;j++) {
73 if(s[i][j].charAt(0)<'0'||s[i][j].charAt(0)>'9') {
74 val[i][j] = cal(s[i][j]);
75 }
76 else {
77 val[i][j] = Double.parseDouble(s[i][j]);
78 }
79 }
80 }
81 for(int i=1;i<=n;i++) {
82 for(int j=1;j<m;j++) {
83 System.out.printf("%.2f ",val[i][j]);
84 }
85 System.out.printf("%.2f\n", val[i][m]);
86 }
87 }
88 }