[传智杯 #3 练习赛] 单位转换
题目描述
我们知道计算机的大小单位有 B, KB, MB 等,现在请你编写一个计算器进行大小单位换算。
提示, 1 1 1 GB = 2 10 2^{10} 210 MB = 2 20 2^{20} 220 KB = 2 30 2^{30} 230 B。
输入格式
输入一个字符串,由一个 0 到 1023 之间的整数,一个单位名称(大写字母),一个等于号和问号,以及第二个单位名称。
单位只有可能是 GB
,MB
,KB
,B
之间的一个。
输出格式
输出一个数字,精确到小数点后 6 位。
样例 #1
样例输入 #1
128MB=?GB
样例输出 #1
0.125000
样例 #2
样例输入 #2
64MB=?KB
样例输出 #2
65536.000000
本人思路(小白一枚,解法可能不是很好,单纯运用下字符串函数语法知识)路过的大神看到有更好的题解可以在评论区发出感谢
//思路1:用strtok函数分割开来算
//思路2:用string find and substr 搭配来用
题解1:
#include<iostream>
#include <string>
#include <cstring>
#include <cmath>
//思路1:用strtok函数分割开来算
//思路2:用string find and substr 搭配来用
using namespace std;
int conversion(char ch) {
if(ch == 'G') return 30;
if(ch == 'M') return 20;
if(ch == 'K') return 10;
if(ch == 'B') return 0;
}
int main(){
//解法一
string s,strs[4];
char *p; //接受分割的字符串
getline(cin,s);
char sc[s.length() + 1];
strcpy(sc,s.c_str());
const char div[4] = "=?";
p = strtok(sc,div);
int index = 0;
while(p != NULL) {
strs[index++] = p;
p = strtok(NULL,div);
}
char ch1 = strs[0][strs[0].length() - 2];
string s1 = strs[0].substr(0,strs[0].length() - 1);
int x = stoi(s1);
// int b = atoi(s1); //atoi()要转换为char类型才可用
char ch2 = strs[1][0];
int con = conversion(ch1) - conversion(ch2);
printf("%f",x * pow(2,con));
return 0;
}
题解2就是运用substr 和 find,思路相同