95分改哭了
查看原帖
95分改哭了
292029
幽理家的男人楼主2020/9/30 20:50

有注释的,希望大佬帮我看看

#include<bits/stdc++.h>
using namespace std;
string s;
int ctt,num[200000];//存2打头的数字结果
char final[200000];//储存结果
int numcal(int ss,int z){//计算从ss到z的十进制值
	int base=pow(2,z-ss),ans=0;
	for(int i=ss;i<=z;++i){
		ans+=(s[i]-'0')*base;
		base/=2;
	}
	return ans;
}
int main(){
	cin>>s;
	int sign=0,l,r;
    int len=s.length();
    for(int i=0;i<len;++i){//检查输入里有没有奇怪的东西
    	if(s[i]!='0'&&s[i]!='1'){
    		cout<<"Error";
    		return 0;
		}
	}
    if(len%8!=0){//不满足8个单元的也不对
    	cout<<"Error";
    	return 0;
	}
	else{
		int cur=len/8;
		for(int i=1;i<=cur;++i){//8i-8----------------8i-1表示每个单元的头到尾(左闭右闭)  
			if(s[8*i-8]=='1'&&s[8*i-7]=='0'&&s[8*i-6]=='1'){//101的读字母
				int num=numcal(8*i-5,8*i-1);
				if(num>25||sign){//大于25或者上一个是一个0打头的单位就错误
					cout<<"Error";
					return 0;
				}
				char temp=num+'A';
				final[++ctt]=temp;
			}
			else if(s[8*i-8]=='1'&&s[8*i-7]=='1'&&s[8*i-6]=='1'){//111空格
				if(sign){
					cout<<"Error";
					return 0;
				}
				final[++ctt]=' ';
			}
			else if(s[8*i-8]=='0'){//数字
			    if(sign==0){//第一个数字
				    l=numcal(8*i-7,8*i-1);
				    sign=1;//标记一下
				}
				else{//第二个数字
					r=numcal(8*i-7,8*i-1);
					sign=0;//归零
					l/=2;r/=2;
					num[++ctt]=l+r;
				}
			}
			else{
				cout<<"Error";
				return 0;
			}
		}
	}
	for(int i=1;i<=ctt;++i){//输出
		if(isalpha(final[i])||final[i]==' ') cout<<final[i];
		else{
	      cout<<num[i];
		}
	}
	return 0;
}
2020/9/30 20:50
加载中...