SICNU_ACM第二次天梯赛选拔

8421 BCD码(15分)

题目: 输入样例:

0101010110001001

输出样例:

5589

AC代码:

#include<bits/stdc++.h>
using namespace std;
int x,ln,f = 0;
int a[10010];
int ch(char s[5]){
          
   
	//cout<<s<<endl; 
	if(!strcmp(s,"0000")) return 0;
	if(!strcmp(s,"0001")) return 1;
	if(!strcmp(s,"0010")) return 2;
	if(!strcmp(s,"0011")) return 3;
	if(!strcmp(s,"0100")) return 4;
	if(!strcmp(s,"0101")) return 5;
	if(!strcmp(s,"0110")) return 6;
	if(!strcmp(s,"0111")) return 7;
	if(!strcmp(s,"1000")) return 8;
	if(!strcmp(s,"1001")) return 9;
	return 0;
}
int main(){
          
   
	char ss[4];
	string s;
	cin>>s;
	int len = s.size();
	if(len%4!=0){
          
   
		x = len/4 +1;
 		if(4-len%4==1){
          
   
		    ss[0] =0,ss[1] = s[0],ss[2] = s[1],ss[3]= s[2],ss[4] =;
		}else if((4-len%4)==2) ss[0] =0,ss[1]=0,ss[2] = s[0],ss[3] = s[1],ss[4]=;
		else if((4-len%4)==3) ss[0] = 0,ss[1]= 0,ss[2] = 0,ss[3]= s[0],ss[4]=;
		a[1] = ch(ss);
	} else x = len/4;
	ln = x;
	for(int i = len-1,j = 3; i >= len%4; i--,j--){
          
   
		ss[j] = s[i];
		if(j==0){
          
   
		    ss[4] =;
			a[x--] = ch(ss);
			j = 4;
		} 
	}	
	for(int i =0 ; i < len;i++) if(s[i]!=0) f = 1;
	if(f==0){
          
   	cout<<0;  return 0;	}
	int ff = 0; 
	for(int i = 1; i <= ln;i++){
          
   
		if(a[i]!=0&&ff==0) ff = 1;  //找到第一个不等于零的数 
		if(ff) cout<<a[i];
	}
	return 0;
}

总结: 富贵险中求。

1.字符数组 一定要给它设置结尾的标志(’’ )不然 会乱码的 2.strcmp 只能直接比较(“1111’,”1111“)这样的字符串或者字符数组,不支持直接比较string类型 3.因为是转换为一个十进制的数 要切记要去除前导零 4.全零输出一个零

❤ 附赠 acm某知名涛姓大佬的得瑟代码改编版:

#include<bits/stdc++.h>
using namespace std;
int main(){
          
   
	string s;
	cin>>s;
	while((int)s.size()%4) s = "0"+ s;  //这里记得是字符串的拼接  双引号
	
	//字符串长度函数 得把返回值强制转换为int型 
	int t = 0,ok  = 0;;
	for(int i = 0; i < (int)s.size();i++){
          
   
		//精髓!
		t = t*2 + (s[i] - 0);  //转为十进制 
		if((i+1)%4==0){
          
   
			if(t)	cout<<t,ok = 1;
			else if(ok) cout<<t;
			t  =0;
		}
	}
  	if(!ok) puts("0"); 
	return 0;
}
经验分享 程序员 微信小程序 职场和发展