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] ='\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;
} 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值