(c语言)进制转换,输入一个数字,其进制为以上二,八,十,十六进制四种之一,以换行结尾。

题目描述

输入一个数字,其进制数可能为以下四种形式:

二进制:以0b开头,包含字符0和1;

八进制:以0开头,包含字符0~7;

十进制:包含字符0-9,且除了自然数0以外的数字不以0开头;

十六进制:以0x开头,包含字符0~9和a~f。

请你将输入数字转换为十进制数字输出。

注意:若输入为0,我们认为它是十进制数,可直接输出0

输入

输入一个数字,其进制为以上四种之一。以换行结尾。

输出

输出转换后的十进制数。

输入样例1:0x1a                 输出样例1:26

输入样例2:0101                 输出样例2:65

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int main() {
	char arr[10] = { 0 }; 
	scanf("%s", &arr);
	int len = strlen(arr);
	int sum = 0;
	int power = 0;
	if (arr[0] == '0') {
		if (arr[1] == 'x') {
/*16*/		for (int i = 2; i < len; i++) {
				int digit = 0;
				if (arr[i] >= '0' && arr[i] <= '9') {
					digit = arr[i] - '0';
				}
				if (arr[i] >= 'a' && arr[i] <= 'f') {
					digit = arr[i] - 'a' + 10;
				}
				power = len - i - 1;
				sum += digit * pow(16, power);
			}
			printf("%d\n", sum);
		}
		else if (arr[1] == 'b') {
/*2*/		for (int i = 2; i < len; i++) {
				int digit = arr[i] - '0';
				power = len - i - 1;
				sum += digit * pow(2, power);
			}
			printf("%d\n", sum);
		}
		else if (arr[1] > '0' && arr[1] <= '7') {
/*8*/		for (int i = 1; i < len; i++) {
				int shu = arr[i] - '0';
				int power = len - i - 1;
				sum += shu * pow(8, power);
			}
			printf("%d\n", sum);
		}
		else {
/*10*/			printf("%s\n", arr);
		}
	}
	else {
		printf("%s\n", arr);
	}
	return 0;
}

       代码思路:1.先用strlen函数计算字符串的长度,即输入的位数;

2.进行分类:二进制,八进制,十六进制都以0开头,而十进制初自然数0之外都不已零开头.

再分类:二进制:以0b开头;八进制:以0开头,后面都为数字;十六进制:以0x开头.

3.计算是把其他进制转化为十进制.

同时,需要注意的是用arr[i]取出来的值是这个数所对应的ascll码值,需要进行转换.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海的宇宙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值