蓝桥杯练习——内存空间

题目 2702: 

蓝桥杯2022年第十三届决赛真题-内存空间(C/C++/Java组)

时间限制: 1s 内存限制: 256MB 提交: 271 解决: 109

题目描述

小蓝最近总喜欢计算自己的代码中定义的变量占用了多少内存空间。

为了简化问题,变量的类型只有以下三种:

int:整型变量,一个 int 型变量占用 4 Byte 的内存空间。

long:长整型变量,一个 long 型变量占用 8 Byte 的内存空间。

String:字符串变量,占用空间和字符串长度有关,设字符串长度为 L,则字符串占用 L Byte 的内存空间,如果字符串长度为 0 则占用 0 Byte 的内存空间。

定义变量的语句只有两种形式,第一种形式为:

type var1=value1,var2=value2…;

定义了若干个 type 类型变量 var1、var2…,并且用 value1、value2 …初始化,

多个变量之间用’,’ 分隔,语句以’;’ 结尾,type 可能是 int、long 或 String。例如 int a=1,b=5,c=6; 占用空间为 12 Byte;long a=1,b=5; 占用空间为 16 Byte;String s1=””,s2=”hello”,s3=”world”; 占用空间为 10 Byte。

第二种形式为:

type[] arr1=new type[size1],arr2=new type[size2]…;

定义了若干 type 类型的一维数组变量 arr1、arr2…,且数组的大小为 size1、size2…,多个变量之间用’,’ 进行分隔,语句以’;’ 结尾,type 只可能是 int 或 long。例如 int[] a1=new int[10]; 占用的内存空间为 40 Byte;long[] a1=new long[10],a2=new long[10]; 占用的内存空间为 160 Byte。

已知小蓝有 T 条定义变量的语句,请你帮他统计下一共占用了多少内存空间。结果的表示方式为:aGBbMBcKBdB,其中 a、b、c、d 为统计的结果,GB、MB、KB、B 为单位。优先用大的单位来表示,1GB=1024MB, 1MB=1024KB,1KB=1024B,其中 B 表示 Byte。如果 a、b、c、d 中的某几个数字为 0,那么不必输出这几个数字及其单位。题目保证一行中只有一句定义变量的语句,且每条语句都满足题干中描述的定义格式,所有的变量名都是合法的且均不重复。题目中的数据很规整,和上述给出的例子类似,除了类型后面有一个空格,以及定义数组时 new 后面的一个空格之外,不会出现多余的空格。

输入格式

输入的第一行包含一个整数 T ,表示有 T 句变量定义的语句。

接下来 T 行,每行包含一句变量定义语句。

输出格式

输出一行包含一个字符串,表示所有语句所占用空间的总大小。

样例输入

复制

1
long[] nums=new long[131072];

样例输出

复制

1MB
package 蓝桥杯练习;

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner in= new Scanner(System.in);
		int T=in.nextInt();//指令的条数
		in.nextLine();
		String[] a=new String[T];
		for(int i=0;i<T;i++) {
			a[i]=in.nextLine();
		}
		int sumB=0;
		while(T>0) {
			char[] as=a[T-1].toCharArray();
			//int类型的两种情况
			if(as[0]=='i') {
				if(as[3]=='[') {//int[] aa=new int[123];
					for(int i=0;i<as.length;i++) {
						if(as[i]=='['&&as[i+1]!=']') {
							i++;
							String shu="";
							while(as[i]!=']'){
								shu+=as[i];
								i++;
							}
							sumB+=Integer.parseInt(shu)*4;
						}
					}
				}
				if(as[3]==' ') {//int a=1,b=2,c=3;
					for(int i=0;i<as.length;i++) {
						if(as[i]=='=')
							sumB+=4;
						}
					}
				}
			//long类型的两种情况
			if(as[0]=='l') {
				if(as[4]==' ') {//long a=1,b=2,c=3;
					for(int i=0;i<as.length;i++) {
						if(as[i]=='=')
							sumB+=8;
						}
					}
				if(as[4]=='[') {//long[] aa=new long[123];
					for(int i=0;i<as.length;i++) {
						if(as[i]=='['&&as[i+1]!=']') {
							i++;
							String shu="";
							while(as[i]!=']'){
								shu+=as[i];
								i++;
							}
							sumB+=Integer.parseInt(shu)*8;
						}
					}
				}
			}
			//String类型的一种情况
			if(as[0]=='S') {
				for(int i=8;i<as.length;i++) {
					if(as[i]=='\"') {
						i++;
						while(as[i]!='\"') {
							sumB++;
							i++;
						}
						
					}
				}
			}
			
			T--;
		}
		//System.out.println(sumB);
		if(sumB>=Math.pow(2, 30)) {//GB
			System.out.print((int)(sumB/Math.pow(2, 30))+"GB");
			sumB%=Math.pow(2, 30);
			if((int)(sumB/Math.pow(2, 20))!=0) {
				System.out.print((int)(sumB/Math.pow(2, 20))+"MB");
			}
			sumB%=Math.pow(2, 20);
			if((int)(sumB/Math.pow(2, 10))!=0) {
				System.out.print((int)(sumB/Math.pow(2, 10))+"KB");
			}
			sumB%=Math.pow(2, 10);
			if(sumB!=0) {
				System.out.println(sumB+"B");
			}
			System.exit(0);
		}
		if(sumB>=Math.pow(2, 20)) {//MB
			System.out.print((int)(sumB/Math.pow(2, 20))+"MB");
			sumB%=Math.pow(2, 20);
			if((int)(sumB/Math.pow(2, 10))!=0) {
				System.out.print((int)(sumB/Math.pow(2, 10))+"KB");
			}
			sumB%=Math.pow(2, 10);
			if(sumB!=0) {
				System.out.println(sumB+"B");
			}
			System.exit(0);
		}
		if(sumB>=Math.pow(2, 10)) {//KB
			System.out.println(sumB/Math.pow(2, 10)+"KB");
			sumB%=Math.pow(2, 10);
			if(sumB!=0) {
				System.out.println(sumB+"B");
			}
			System.exit(0);
		}
		System.out.println(sumB+"B");
	}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值