C程序-蓝桥-基础练习 十六进制转十进制

问题描述

  从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
  注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。

样例输入

FFFF

样例输出

65535

方法1:直接输入输出即可,不过数据大小必须在长整型范围内;虽然这样也能AC,但是这并不是我们的目标

#include <stdio.h>

int main( ) 
{
	long long n;
	scanf("%x",&n);//以16进制方式输入 
	printf("%lld",n);//以10进制方式输出 
	return 0;
}

 

方法2:任意进制转换成十进制,系数 * 基数^权重   之和。长整型范围内

#include <iostream>
#include <stdio.h>
#include <string.h>

const int N=16;

int XtoD(char *s);//十六进制转十进制函数 

int main( ) 
{
	char str[N];

	scanf("%s",str);
	XtoD(str);
	
	return 0;
}

int XtoD(char *s)
{
	int i,j;
	int len=strlen(s);
	long long k=0,d=1;
	for(i=len-1;i>=0;i--)//提取单个十六进制位数 
	{
		if(s[i]>='A')
			k+=(s[i]-'A'+10)*d;//k是系数 
		else
			k+=(s[i]-'0')*d;
		d*=16;//基数^权重 
	}
	printf("%lld",k);
	return 0;
}

 方法3:定义一个数组存储数据,这样可以处理更大的位数;任意进制转换成十进制,系数 * 基数^权重   之和

#include <iostream>
#include <stdio.h>

const int N=16;

int XtoD(char *s);//十六进制转十进制函数 
int solve(int *n,int m);//

int main( ) 
{
	char str[N];
	scanf("%s",str);
	XtoD(str);
	return 0;
}

int XtoD(char *s)
{
	int i,j,k;
	int num_10[N]={0};//初始化 
	for(i=0;s[i]!='\0';i++)//提取单个十六进制位数 
	{
		if(s[i]>='A')
			k=s[i]-'A'+10;
		else
			k=s[i]-'0';
		solve(num_10,k);
	}
	for(i=0;num_10[i]==0&&i<N-1;i++);//前导0不用输出,但是只有0时还是要输出一个0 
	for(;i<N;i++)
		printf("%d",num_10[i]);//打印十进制 
	return 0;
}

int solve(int *n,int m)
{
	int A[N]={0},B[N]={0};//初始化 
	for(int i=N-1;i>0;i--)//实现n*16; 
	{
		A[i]=n[i]*6;//个位 ,*6 
		B[i-1]=n[i];//左移一位,*10 
	}
	n[N-1]=m;//初始化,加m 
	for(int i=N-1;i>0;i--)//实现n*16;
	{
		n[i]+=A[i]+B[i];//乘法竖式 
		if(n[i]>10)//有进位 
		{
			n[i-1]=n[i]/10;
			n[i]=n[i]%10;
		}
		else//无进位 
			n[i-1]=0;
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值