题目:
编程实现输入任意进制数,并输入几进制,将其转换为十进制并输出
理解:
输入用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]