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] ='\0';
}else if((4-len%4)==2) ss[0] ='0',ss[1]='0',ss[2] = s[0],ss[3] = s[1],ss[4]='\0';
else if((4-len%4)==3) ss[0] = '0',ss[1]= '0',ss[2] = '0',ss[3]= s[0],ss[4]='\0';
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] ='\0';
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.字符数组 一定要给它设置结尾的标志(’\0’ )不然 会乱码的
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;
}