一.十转十六
常用的数学思维十转十六是对一个十进制的数反复对十六求余,然后对其进行逆序排列。其中十六进制的数是满十六进一,10~15依次用ABCDEF表示。对此我们设立一个字符串数组,里面存储0123456789ABCDEF这个十六个字符。我们对输入的十进制数进行求余然后得出的余数对应着数组中的同一位置同一字符。然后再利用字符型指针对其进行逆序即可得到十六进制数。具体代码如下:
#include <stdio.h>
int main()
{
char hex[] = "0123456789ABCDEF";//存储数组
char str1[100],str2[100];
char *p = str1; char *q = str2;//分别用于一次存储和逆序存储
int n = 0;
int x;
scanf("%d",&x);
if(x==0)
{
*q = hex[x%16];
}
else
{
while(x)
{
*p++ = hex[x%16];//对应的余数进行存储
x = x/16;
n++;
}
p--;
while(n)
{
*q++ = *p--;//逆序
n--;
}
}
printf("%s",str2);
return 0;
}
二.十六转十
会了十转十六,反过来十六转十就是十分简单的。利用switch语句进行0~F的十进制转换判断。 同时设立变量储存位数,然后进行次幂的求和。具体代码如下:
#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
char a[8];
int index;
int b[8];
scanf("%s",a);
int len = strlen(a);
int p = 0;
double sum = 0;
for (int i = 0; i < len; i++)
{
switch (a[i]) {
case '0':b[p++] = 0;break;
case '1':b[p++] = 1;break;
case '2':b[p++] = 2;break;
case '3':b[p++] = 3;break;
case '4':b[p++] = 4;break;
case '5':b[p++] = 5;break;
case '6':b[p++] = 6;break;
case '7':b[p++] = 7;break;
case '8':b[p++] = 8;break;
case '9':b[p++] = 9;break;
case 'A':b[p++] = 10;break;
case 'B':b[p++] = 11;break;
case 'C':b[p++] = 12;break;
case 'D':b[p++] = 13;break;
case 'E':b[p++] = 14;break;
case 'F':b[p++] = 15;break;
default:break;
}
index = p;
}
for (int i = 0; i < len; i++)
{
sum = sum+ pow(16,index-1)*b[i];
index--;
}
printf("%.0lf",sum);
return 0;
}