zoukankan      html  css  js  c++  java
  • 蓝桥杯 表格计算 (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 }
  • 相关阅读:
    spring Boot 学习(四、Spring Boot与任务)
    spring Boot 学习(三、Spring Boot与检索)
    spring Boot 学习(二、Spring Boot与缓存)
    spring Boot 学习(一、Spring Boot与缓存)
    Java程序员必了解的JVM原理以及虚拟机的运行过程
    springcolud 的学习(四)服务治理. Eureka
    springcolud 的学习(二).SpringCloud微服务框架
    springcolud 的学习(二).微服务架构的介绍
    Oracle DECODE函数的用法详解
    C#读取excl(兼容office多种版本)
  • 原文地址:https://www.cnblogs.com/1013star/p/10736668.html
Copyright © 2011-2022 走看看