蓝桥杯 表格计算 (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
", val[i][m]);
86         }
87     }
88 }