/*
题目:UTF-8汉字编码,UTF-8是变长的字节,
UTF-8:变长编码,最长6个字节。如下:
1字节 0xxxxxxx
2字节 110xxxxx 10xxxxxx
3字节 1110xxxx 10xxxxxx 10xxxxxx
4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
入参:入C0C0,两字节,求汉字编码,不满足UTF-8要求的输出-1
- Description: 上机编程认证
- Note: 缺省代码仅供参考,可自行决定使用、修改或删除
*/
#include
#include
#include
#include
// 待实现函数,在此函数中填入答题代码
class Solution {
public:
int Num(int n) { // 1的位置
int ret = 1;
for (int i = 0; i < n; i++) {
ret *= 2;
}
//cout<<"2 "<<n<<“次 :”<<ret<<endl;
return ret;
}
string Tran(char ch) {
int num = 0;
if (ch >= 'A') {
num = 10 + (ch - 'A');
}
else if (ch <= '9') {
num = ch - '0';
}
string temp;
temp += to_string(num / 8);
num = num % 8;
temp += to_string(num / 4);
num = num % 4;
temp += to_string(num / 2);
num = num % 2;
temp += to_string(num);
// cout<<ch<<"十六进制字符转二进制:temp:"<<temp<<endl;
return temp;
}
int GetResult(string str) {
int num = 0;
for (int i = 0; i < str.size(); i++) {
if (str[i] != '0') {
num += Num(str.size() - 1 - i);
}
}
//cout<<"num:"<<num<<endl;
return num;
}
int EncodingVerify(const string &input)
{
string ss = input;
//cout<<input<<endl;
//cout<<input[0]<<endl;
int result = 0;
int len = input.size() / 2; // 字节数
// 1.转换字符
string str;
for (int i = 0; i < ss.size(); i++) {
char temp = ss[i];
str += Tran(temp);
}
//cout<<str<<endl;
// 2.判断是否合法
// 3.拼接
string outStr;
if (len == 1) {
if (str[0] != '0') {
return -1;
}
else {
outStr = str.substr(1, 7);
}
cout << "outStr:" << outStr << endl;
}
else {
string frist = "0";
string other = "10";
for (int i = 0; i < len; i++) {
frist.insert(0, "1");
}
//cout<<"frist:"<<frist<<endl;
if (str.substr(0, len + 1) != frist)
{
return -1;
}
outStr += str.substr(len + 1, 8 - len - 1);
for (int i = 1; i < len; i++) {
if (str.substr(8 * i, 2) != other) {
return -1;
}
else {
outStr += str.substr(8 * i + 2, 6);
}
}
}
//cout<<"outStr"<<outStr<<endl;
// 4.计算
result = GetResult(outStr);
return result;
}
};
// 以下为考题输入输出框架,此部分代码不建议改动
inline string ReadLine()
{
string line;
getline(cin, line);
return line;
}
int main()
{
string input = ReadLine();
Solution solu;
int result = solu.EncodingVerify(input);
cout << result << endl;
return 0;
}