蓝桥杯 表格计算 (JAVA模拟 注意细节)

时间:2022-09-10 00:09:44

蓝桥杯 表格计算


某次无聊中, 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 }