代码来源:b站
阿-岳同学
试题
D:
内存空间
时间限制
: 10.0s
内存限制
: 512.0MB
本题总分:
10
分
【问题描述】
小蓝最近总喜欢计算自己的代码中定义的变量占用了多少内存空间。
为了简化问题,变量的类型只有以下三种:
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
试题
D:
内存空间
6
第十三届蓝桥杯大赛软件赛决赛
Python
大学
B
组
Byte
;
long[] a1=new long[10],a2=new long[10];
占用的内存空间为
160
Byte
。
已知小蓝有
T
条定义变量的语句,请你帮他统计下一共占用了多少内
存空间。结果的表示方式为:
a
GB
b
MB
c
KB
d
B
,其中
a
、
b
、
c
、
d
为统计的
结果,
GB
、
MB
、
KB
、
B
为单位。优先用大的单位来表示,
1
GB=
1024
MB
,
1
MB=
1024
KB
,
1
KB=
1024
B
,其中
B
表示
Byte
。如果
a
、
b
、
c
、
d
中的某几个
数字为
0
,那么不必输出这几个数字及其单位。题目保证一行中只有一句定义
变量的语句,且每条语句都满足题干中描述的定义格式,所有的变量名都是合
法的且均不重复。题目中的数据很规整,和上述给出的例子类似,除了类型后
面有一个空格,以及定义数组时
new
后面的一个空格之外,不会出现多余的空
格。
【输入格式】
输入的第一行包含一个整数
T
,表示有
T
句变量定义的语句。
接下来
T
行,每行包含一句变量定义语句。
【输出格式】
输出一行包含一个字符串,表示所有语句所占用空间的总大小。
【样例输入
1
】
1
long[] nums=new long[131072];
【样例输出
1
】
1MB
【样例输入
2
】
4
int a=0,b=0;
long x=0,y=0;
String s1=”hello”,s2=”world”;
试题
D:
内存空间
7
第十三届蓝桥杯大赛软件赛决赛
Python
大学
B
组
long[] arr1=new long[100000],arr2=new long[100000];
【样例输出
2
】
1MB538KB546B
【样例说明】
样例
1
,占用的空间为
131072
×
8 = 1048576
B
,换算过后正好是
1
MB
,其
它三个单位
GB
、
KB
、
B
前面的数字都为
0
,所以不用输出。
样例
2
,占用的空间为
4
×
2 + 8
×
2 + 10 + 8
×
100000
×
2
B
,换算后是
1
MB
538
KB
546
B
。
【评测用例规模与约定】
对于所有评测用例,
1
≤
T
≤
10
,每条变量定义语句的长度不会超过
1000
。所有的变量名称长度不会超过
10
,且都由小写字母和数字组成。对于整型变
量,初始化的值均是在其表示范围内的十进制整数,初始化的值不会是变量。
对于
String
类型的变量,初始化的内容长度不会超过
50
,且内容仅包含小写
字母和数字,初始化的值不会是变量。对于数组类型变量,数组的长度为一个
整数,范围为:
[0
,
2
30
]
,数组的长度不会是变量。
T
条语句定义的变量所占的内
存空间总大小不会超过
1
GB
,且大于
0
B
。
# -*- encoding: utf-8 -*-
def main():
T = int(input())
B = 0
for _ in range(T):
line = input()
line = line.replace(";", "")
if line.startswith("int[] "):
line = line.replace("int[] ", "")
statement = line.split(",")
for state in statement:
numberStr = ""
flat = False
for char in state:
if flat:
numberStr += char
if char == "[":
flat = True
if char == "]":
break
number = int(numberStr[:-1])
B += number * 4
...
if line.startswith("long[] "):
line = line.replace("long[] ", "")
statement = line.split(",")
for state in statement:
numberStr = ""
flat = False
for char in state:
if flat and char.isdigit():
numberStr += char
if char == "[":
flat = True
if char == "]":
break
number = int(numberStr)
B += number * 8
...
if line.startswith("int "):
B += line.count("=") * 4
if line.startswith("long "):
B += line.count("=") * 8
if line.startswith("String "):
# String s1="",s2="hello",s3="world";
flag = False
charNum = 0
for char in line:
if flag and char not in ["\"", "”"]:
charNum += 1
if char in ["\"", "”"]:
flag = not flag
B += charNum
KB = B // 1024
MB = KB // 1024
GB = MB // 1024
B %= 1024
KB %= 1024
MB %= 1024
# print(GB, MB, KB, B)
res = ""
if GB:
res += f"{GB}GB"
if MB:
res += f"{MB}MB"
if KB:
res += f"{KB}KB"
if B:
res += f"{B}B"
print(res)
return None
if __name__ == "__main__":
main()