T156528 单位转换
题目描述
我们知道计算机的大小单位有 B, KB, MB 等,现在请你编写一个计算器进行大小单位换算。
提示, 1 G B = 2 10 M B = 2 20 K B = 2 30 B 1 GB = 2^{10} MB = 2^{20} KB = 2^{30} B 1GB=210MB=220KB=230B。
输入格式
输入一个字符串,由一个 0 到 1023 之间的整数,一个单位名称(大写字母),一个等于号和问号,以及第二个单位名称。
单位只有可能是 GB
,MB
,KB
,B
之间的一个。
输出格式
输出一个数字,精确到小数点后 6 位。
输入输出样例
输入 #1
128MB=?GB
输出 #1
0.125000
输入 #2
64MB=?KB
输出 #2
65536.000000
AC代码
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;
char dwstr[4][3]={"GB","MB","KB","B"};
bool isNum(char c){return c>='0'&&c<='9';}
int strToInt(char str[],int start,int end){
int num=0;
for(int i=start;i<end;i++){
num+=(str[i]-'0')*(int)pow(10,end-i-1);
}
return num;
}
void dwCopy(char s[],int start,int end,char dw[]){
int k=0;
for(int i=start;i<end;i++){
dw[k++]=s[i];
}
dw[k]='\0';
}
int main()
{
int n;
char s[10];
cin>>s;
int num;
double ans;
int flag=0;
int start;
char dw1[3], dw2[3];
for(int i=0;i<strlen(s);i++){
if(flag==0&&isNum(s[i])){
start=i;
flag=1;
}
if(flag==1&&!isNum(s[i])){
num=strToInt(s,0,i);
start=i;
flag=2;
}
if(flag==2&&s[i]=='='){
dwCopy(s,start,i,dw1);
flag=3;
}
if(flag==3&&s[i]=='?'){
start=i+1;
flag=4;
}
if(flag==4&&s[i]=='B'){
dwCopy(s,start,i+1,dw2);
flag=5;
}
}
// printf("%d %s = ? %s\n",num,dw1,dw2);//测试
int a,b;
for(int i=0;i<4;i++){
if(strcmp(dwstr[i],dw1)==0) a=i;
if(strcmp(dwstr[i],dw2)==0) b=i;
}
ans=pow(2,(b-a)*10)*num;
printf("%.6f\n",ans);
return 0;
}