<编程>输入任意进制数,转换为十进制

题目:

         编程实现输入任意进制数,并输入几进制,将其转换为十进制并输出

理解

         输入用scanf实现,大于9进制的数用大写字母表示,通过函数实现进制的转换

平台使用linux,编译器gcc;

代码:

#include <stdio.h>
#include <string.h>//strlen函数头文件

//#include <unistd.h>
//任意n进制转换为10进制
//本来以为要写两个函数2——9进制,11——16进制的
//11-16进制想法都是一样的
//原理:将输入的数以字符串的形式存入字符串数组一个一个的取数,再转换为
//char--->int (隐式转换),即可参与计算

void fun_2_N(char *a,int b){
	char *p=a;
	int i=0;
	int sum=0;
	int k=0;
	int jz=1;
   //获取字符串的长度可以用,strlen函数
	for(;*p!='\0';p++){
		i++;//字符串的长度	
	}
	p=a;//p指向字符串的首地址
	for(;*p!='\0';p++){
		//47~58之间的数为0~9,在ASCII表中,
       //if~else语句判断输入的是数字还是大写字母
		if(*p>47&&*p<58)
			k=*p-48;
		else
			k=*p-65+10;
		for(int c=i-1;c>0;c--){
			//实现每位的权重,n^0 n^1 n^2 ...
			jz*=b;
		}
        //将每一位的结果相加
		sum=sum+k*jz;
		jz=1;
		i--;	
	}
	printf("十进制数为:%d\n",sum);
}
int main(void){
	printf("请输入一个进制数(字母用大写):");
	char a[16];
	scanf("%s",a);
	printf("几进制?:");
	int b;
	scanf("%d",&b);
	fun_2_N(a,b);//实现进制转换
	return 0;
}

fun_2_N函数实现进制的转换,将输入的进制数用字符串存储,在用char *p取出每一位,转化为int数据(隐式转换)

注意:

        首先要获取字符串的长度,方便后面的权重计算

        字符型数+/-整型数,结果自动转换为int类型

       出现错误可以用printf()跟踪打印可能出现问题的地方相关值;

我没有判断输入的字符不满足条件的问题,只是提示用户输入时注意!!!

2,一个16进制无符号数解析成10进制

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

unsigned int swqpTonum(int index , unsigned char value)
{
	unsigned int basic = 0;
	unsigned int tmp = 0;
	int i = 0;

	switch(index)
	{
		case 0: basic = 1; break; //2^0
		case 1: basic = 256; break;//255; break; //2^8
		case 2: basic = 65536; break;//65535; break;//2^16
		case 3: basic = 16777216; break; //16777215; break;//2^24
		default:
			return 0;//error
	}
	//取value的每一位
	for( i = 0 ; i < 8 ; i++ )
	{

		if( (value>>i)& 0x1)
		{
			tmp += (basic * 1);
			printf("[%d]",i);
		}

		basic *= 2;
	}
	printf("\n");
	return tmp;
}

unsigned int get_time(unsigned int upgrade_time)
{

	unsigned int tmp = upgrade_time;
	unsigned char deSes = 0;
	unsigned int sum = 0;
	unsigned int ret = 0;
	int i = 0;

	for(i=0; i< 4 ;i++)
	{

		deSes = (tmp >> (i*8)) & 0xff;

		switch( i )
		{
			case 0:
			{
				ret = swqpTonum( i, deSes);
				if(ret == 0)
				{
					printf("error [%d]\n", i);
					break;
				}
				sum += ret;
			}
			break;
			case 1:
			{
				ret = swqpTonum( i, deSes);
				if(ret == 0)
				{
					printf("error [%d]\n", i);
					break;
				}
				sum += ret;
			}
			break;
			case 2:
			{
				ret = swqpTonum( i, deSes);
				if(ret == 0)
				{
					printf("error [%d]\n", i);
					break;
				}
				sum += ret;
			}
			break;
			case 3:
			{
				ret = swqpTonum( i, deSes);
				if(ret == 0)
				{
					printf("error [%d]\n", i);
					break;
				}
				sum += ret;
			}
			break;
			default:
				printf("Error\n");
				break;

		}
		printf("dse==tmp==>[%ld][%ld]\n", deSes , ret);
		deSes = 0;
	}

	return sum;
}
//将一个16进制数转换为10进制,同样该函数也适合对时间的解析,再linu固件头中有一个时间头,是16进制的,可以用来解析成秒
int main()
{
	unsigned int sum  = 0x64242976;//1680091510
	unsigned int dse = 0;
	time_t sys_time ={0};
	struct tm *sys_tm = NULL;

	//time(&sys_time);

	

	dse = get_time(sum);
	if(dse == 0)
	{
		printf("[error][%ld]\n", dse);
	}
	else
		printf("dse====>[%ld]\n", dse);

	sys_tm = localtime((time_t *)&dse);
	printf("[year= %04d, Mon= %02d, Day= %02d, Hour= %2d, Min=%2d]\n", sys_tm->tm_year + 1900, sys_tm->tm_mon , sys_tm->tm_mday , sys_tm->tm_hour ,sys_tm->tm_min );
	return 0;
}

结果:

dse====>[1680091510]
[year= 2023, Mon= 02, Day= 29, Hour= 12, Min= 5]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值