#include<bits/stdc++.h>
using namespace std;
const int MAXN=15;
long long sum = 0;
int lgth;
string str[MAXN];
int put_ele(string st){
int ele=0,pos,pos2,lg,total=0,ll=3,i;
//int || long
if (st.substr(0,3)=="int") ele=4;
else if (st.substr(0,4)=="long"){
ele=8;ll=4;
}
//数组
if ((ele==4 or ele==8)) {
if (st[ll]=='['){
string l=st.substr(ll+2,st.size()-ll-2);
while (l!=";"){
pos=l.find("[");
pos2=l.find("]");
lg=atoi((l.substr(pos+1,pos2-pos)).c_str());
total+=lg*ele;
l=l.substr(l.find(']')+1,l.size()-l.find("]")+1);
}
}
//单个
else{
string l=st.substr(ll,st.size()-ll);
while (l!=";"){
pos=l.find("=");
i=pos+1;
while (l[i]!=',' and l[i]!=';') i++;
total+=ele;
l=l.substr(i,l.size()-i);
}
}
}
//字符
else if (st.substr(0,6)=="String"){
string l=st.substr(6,st.size()-6);
while (l!=";"){
pos=l.find('"');
i=pos+1;
while (l[i]!='"') i++;
lg=i-pos-1;
total+=lg;
l=l.substr(i+1,l.size()-i-1);
}
}
return total;
}
int main(){
scanf("%d",&lgth);
cin.get();
for (int i=0;i<lgth;i++) getline(cin,str[i]);
for (int i=0;i<lgth;i++) sum+=put_ele(str[i]);
if (sum/(1024*1024*1024)!=0) {
cout<<sum/(1024*1024*1024)<<"GB";
sum%=(1024*1024*1024);
}
if (sum/(1024*1024)!=0) {
cout<<sum/(1024*1024)<<"MB";
sum%=(1024*1024);
}
if (sum/1024!=0){
cout<<sum/1024<<"KB";
sum%=1024;
}
if (sum!=0) cout<<sum<<"B";
return 0;
}
代码解释:
get.cin():为了吞掉多余的空行
num = atoi(str.substr(st,10).c_str) substr(start,len)截取从start开始的len长度子串,返回子串,c_str将字串变成字符数组指针char*,atoi字符转化成数字。(对应的是itoa)
总结
字母,符号,数字交错关键是找到标记点,从哪里到哪里读入数字。
这道题结束标志就是“;”,数字标志就是“[ ]”或者“=”;
模拟题建议可以在草稿纸画好逻辑