seo网站优化软件价格,安徽两学一做专题网站,wordpress大战,互联网网站标题#xff1a;表格计算某次无聊中#xff0c; atm 发现了一个很老的程序。这个程序的功能类似于 Excel #xff0c;它对一个表格进行操作。
不妨设表格有 n 行#xff0c;每行有 m 个格子。
每个格子的内容可以是一个正整数#xff0c;也可以是一个公式。
公式包括三种表格计算某次无聊中 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思路非常抱歉的是代码量不少如果有人有更好的解法可以私信我。这个题目实际上思路非常清晰分析每个单元格中的内容如果出现SUM、AVG、STD则进行数据处理。而在进行数据处理的过程中我们需要获取到其中的x1, x2, y2, y2才能继续进行由于这四个值不仅仅是个位数的情况这里采用s.indexOf()的方法找准位置然后进行分割其中两个“”的划分第一个“”直接截取第二个“”先将第一个“”截去然后再二次截取。获取到四个坐标之后在求解表达式的过程中要判断类似sum中包含sum的情况所以要递归调用func()函数。
完整代码如下
import java.util.Scanner;public class Main
{static String[][] str new String[50][50];static double[][] d new double[50][50];static int n, m;public static void main(String[] args) {Scanner in new Scanner(System.in);n in.nextInt();m in.nextInt();for (int i 1; i n; i) {for (int j 1; j m; j) {String c in.next();str[i][j] c;}}for (int i 1; i n; i) {for (int j 1; j m; j) {if (str[i][j].charAt(0) 0 || str[i][j].charAt(0) 9) {d[i][j] func(str[i][j], i, j);} else {d[i][j] Double.valueOf(str[i][j]);}}}for (int i 1; i n; i) {for (int j 1; j m; j) {System.out.printf(%.2f ,d[i][j]);}System.out.printf(%.2f\n, d[i][m]);}}/*** 这里必须采用函数的方式将这里包起来因为有的sum处理里面还会包含sum所以需要再次调用这里的函数。* */private static double func(String string, int i, int j) {// TODO Auto-generated method stubint subce[] sub(str[i][j]);if (str[i][j].substring(0, 3).equals(SUM)) {return sum(subce);} else if (str[i][j].substring(0, 3).equals(AVG)) {return avg(subce);} else if (str[i][j].substring(0, 3).equals(STD)) {return std(subce);} else {return -1;}}/*** 三个表达式的计算都很简单* 在求avg和std中要有注意如何求四个坐标所围矩阵中单元格的个数可以使用(x2-x11)*(y2-y11)也可以直接计数* 由于每个计算都有可能出现类似sum的计算中包含sum的情况所以要进行判断再次调用func()* */private static double sum(int[] ce2) {// TODO Auto-generated method stubdouble cnt 0.0;for (int i ce2[1]; i ce2[3]; i) {for (int j ce2[2]; j ce2[4]; j) {if (str[i][j].charAt(0) 0 || str[i][j].charAt(0) 9) {cnt func(str[i][j], i, j);} else {cnt Double.valueOf(str[i][j]);}}}return cnt;}private static double avg(int[] ce2) {// TODO Auto-generated method stubdouble cnt 0.0;int q 0;for (int i ce2[1]; i ce2[3]; i) {for (int j ce2[2]; j ce2[4]; j) {if (str[i][j].charAt(0) 0 || str[i][j].charAt(0) 9) {cnt func(str[i][j], i, j);} else {cnt Double.valueOf(str[i][j]);}q;}}return cnt/q;}private static double std(int[] ce2) {// TODO Auto-generated method stubdouble cnt 0.0;int q 0;double x avg(ce2);for (int i ce2[1]; i ce2[3]; i) {for (int j ce2[2]; j ce2[4]; j) {if (str[i][j].charAt(0) 0 || str[i][j].charAt(0) 9) {cnt Math.pow(func(str[i][j], i, j) - x, 2);} else {cnt Math.pow(Double.valueOf(str[i][j]) - x, 2);}q;}}return Math.sqrt(cnt/q);}/**** 下面是对表达式进行截取拆分获取x1,x2,y1,y2的过程* 由于出现了两次,,所以在获取的过程中要注意第二个,的获取可以先将前一个,连同之前的内容截去然后再进行一次截取* */private static int[] sub(String s) {// TODO Auto-generated method stubint[] ce new int[5];for (int i 0; i ce.length; i) {ce[i] 0;}int befKuohao s.indexOf(();int firstDouhao s.indexOf(,);int maohao s.indexOf(:);int secDouhao s.substring((s.indexOf(,)1)).indexOf(,) (s.indexOf(,)1);int aftKuohao s.indexOf());ce[1] Integer.valueOf(s.substring(befKuohao1, firstDouhao));ce[2] Integer.valueOf(s.substring(firstDouhao1, maohao));ce[3] Integer.valueOf(s.substring(maohao1, secDouhao));ce[4] Integer.valueOf(s.substring(secDouhao1, aftKuohao));return ce;}
}