先上代码
#include <stdio.h>
#include <string.h>
#include <math.h>
int sixteen_to_ten(char a[])
{
long long int i,j=0,k=(int)strlen(a);
long long int d;
d=0;
for (k=(int)strlen(a); k>0; k--)
{
if((int)a[k-1]>=(int)'0' && (int)a[k-1]<=(int)'9')
{
float b=pow(16,j);
long long int c=(int)b;
d=d+((int)a[k-1]-(int)'0')*c;
}
else
{
d=d+(((int)a[k-1]-(int)'A')+10)*(int)pow(16,j);
}
j=j+1;
}
return d;
}
void ten_to_two(int x)
{
int i=0,j=0;
static int a[1000];
while(x)
{
a[i++]=x%2;
x=x/2;
}
printf("二进制为:");
for( ; i>0; i--)
{
printf("%d",a[i-1]);
}
}
int main()
{
long long int sum=0;
char a[1000];
scanf("%s",&a);
sum=sixteen_to_ten(a);
printf("%d\n",sum);
ten_to_two(sum);
return 0;
}
不知道出了什么问题只通过75%另外那个需要VIP权限才能看。
推测是因为数据过大的原因,或者精度遗失。 更偏向于数据过大。欢迎各位大佬指正。
代码思路很简单,十六进制数要转化成十进制数,因为十六进制中有ABCDEF来分别代表10-15.所以肯定需要用字符串的形式进行输入,然后就需要对字符串进行进制转换处理,进制转换成十进制的方法很简单,比如1234567(十六进制)转换成十进制,十进制就等于7 * 16^0+6 * 16*1 +5 * 16^2.....一直依次次方数递增直到最后一个数。但是注意这里是字符串形式,每个数据都是字符形式,很明显我们就需要动用ASCII码进行转换操作。ASCII表见下图,完整图表可见菜鸟教程。
明显可见红色部分,存在数字和字母,那么我们只需要将相应字符对应的ASCII码值相减就可以得到一个数字,假设现在这个字符是5那么我们用其对应的十进制码值减去0对应的十进制码值就可以得到5,就是原本的数字大小,同理字母也可以如此计算比如字符F,用其码值减去A的码值就会得到5,再加上10就可以表示十六进制中的15,同样可以用此方法来判定是不是字母还是数字,字母的ASCII码值较大与0的码值相减不可能在10的范围内就可以通过这样判定是否是数字。
接下来就只需要做一个循环来模拟进制转换过程即可。
接下来说说十进制转二进制。这个更简单只需要用10进制数不停的用2取余保存余数即可。代码很简单直接用while循环一直模拟操作就可。