字符串转换成十进制整数(1-72) ---进制转换

字符串转换成十进制整数(1-72) —进制转换

题目描述:

输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。

输入:

输入在一行中给出一个以#结束的非空字符串。

输出:

在一行中输出转换后的十进制数。题目保证输出在长整型范围内。

输入样例:

+-P-xf4+-1!#

输出样例:

-3905

题目来源:

ECNU_DASE_OJ_1-72

思路/题点:

  1. 在输入字符串的过程中判断是否是合法的16进制字符,如果是放入字符串中,否则不做处理。
  2. 要处理正负号:用两个判断标记,如果该字符属于16进制字符,标记flag1=true,表示转换数大于0,如果不属于16进制字符但等于‘-’,就判断flag1是否为true,如果flag1为fasle代表第一个16进制字符前存在‘-’。如果flag1和flag2同时为true就输出‘-’。
  3. 在16进制转换为10进制的过程中,遇到字符a-f和A-F如何处理呢,要转换成对应的数字代入运算,还要制定转换规则,区分大小写字母。因为只有12个字母要转成数字所以用简单粗暴的switch语句处理了。然后还有在输入的时候的数字是字符,进制运算时要用数字,转换规则为‘数字’-‘0’=数字。

题解代码

纯C语言(OJ只给了C语言提交方式)
#include<stdio.h>

char str[10010];
int JudeIsH(char n){
	if(n>='0' && n<='9' || n>='A' && n<='F' || n>='a' && n<='f')
		return 1;
	else
		return 0;
}

int main(){
	char c;
	long long n=0;
	int flag1=0;
	int flag2=0;
	int la=0;
	while(~scanf("%c",&c) && c!='#'){
		if(JudeIsH(c))
		{
			str[la++]=c;
			flag1=1;
		}
		else if(c=='-' && !flag1) 
			flag2=1;		
	}
	if(flag2 && flag1)//负号的处理
		printf("-");
	int product =1;
	for(int i=la-1;i>=0;i--){
		switch(str[i])//处理各字符转成对应数字
        {
			case 'A':
			case 'a': str[i]=10;break;
			case 'B':
			case 'b': str[i]=11;break;
			case 'C':
			case 'c': str[i]=12;break;
			case 'D':
			case 'd': str[i]=13;break;
			case 'E':
			case 'e': str[i]=14;break;
			case 'F':
			case 'f': str[i]=15;break;
			default: str[i]-='0';break;
		}
		n+=str[i]*product;
		product*=16;
	} 
	printf("%lld",n);
	return 0;
}
C++代码

与C语言不同的地方:使用了bool类型,使用了vector容器,因为vector支持基本操作的方法。

#include<cstdio>
#include<vector>

using namespace std;
bool JudeIsH(char n){
	if(n>='0' && n<='9' || n>='A' && n<='F' || n>='a' && n<='f')
		return true;
	else
		return false;
}

int main(){
	char c;
	vector<char> v;
	long long n=0;
	bool flag1=false;
	bool flag2=false;
	while(~scanf("%c",&c) && c!='#'){
		if(JudeIsH(c))
		{
			v.push_back(c);
			flag1=true;
		}
		else if(c=='-' && !flag1) 
			flag2=true;		
	}
	if(flag1 && flag2)
		printf("-");
	int product =1;
	for(int i=v.size()-1;i>=0;i--){
		switch(v[i]){
			case 'A':
			case 'a': v[i]=10;break;
			case 'B':
			case 'b': v[i]=11;break;
			case 'C':
			case 'c': v[i]=12;break;
			case 'D':
			case 'd': v[i]=13;break;
			case 'E':
			case 'e': v[i]=14;break;
			case 'F':
			case 'f': v[i]=15;break;
			default: v[i]-='0';break;
		}
		n+=v[i]*product;
		product*=16;
	} 
	printf("%lld",n);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值