进制转换
1, 2进制转化为10进制
实现方法:
2的0次方乘以最后一位数,加上2的1次方乘以倒数第二位数,…累加下去,直到加2的n(该2进制数的位数)次方乘以第一位数。又数组从c[0]开始,到c[数组长度-1]结束,
因此总结下来,即倒数第i位数乘以2的i次方 累加: ∑ i = 0 s t r l e n ( c ) − 1 c [ i ] ∗ 2 i \sum_{i=0}^{strlen(c)-1} \ {c[i] * {2^i}} ∑i=0strlen(c)−1 c[i]∗2i
即:c[0] * 20 + c[1] * 21 + … + c[i] * 2i + … + c[strlen©-1] * 2(strlen©-1)
#include <stdio.h>
#include <string.h>
int cf(int n)//定义一个2的乘方函数,便于后续累加
{
int result = 1;//初始化为 1!
while (n --)//乘n次
result *= 2;
return(result);
}
int main()
{
int i, sum = 0;//变量需要作用的范围决定它在哪里定义
char c[31];
scanf("%s", c);//用scanf输入字符串以除去空格等其他字符
for (i = 0; i < strlen(c); i ++)//用strlen函数测定字符串长度,即二进制数的位数,从而得出之后循环结束的条件 ,即循环需要执行n(数的位数)次
sum = sum + (c[strlen(c) - 1 - i] - '0') * cf(i);/*数字字符的ASCII码减去0的ASCII码即为数字的值
以字符数组的形式输入数字,再将每个数组元素-'0',即可得到对应的数字 (!!!),这样还可以通过strlen函数直接测出数字位数*/
printf("%d\n", sum);
return 0;
}
2, 10进制转化为2进制
#include <stdio.h>
#include <string.h>
//除2取余法
int convert(int n, char result[])
{
int i = 0, j = 0;
char f[500000] = {
'\0'};
while (n/2 != 0)//直到商为0结束
{
f[i ++] = n % 2 + '0';//余数作为二进制中的一位
n = n / 2;//商再作为被除数 除以2
}
f[i] = '1';//二进制数的第一位为1
for (i = i; i >= 0; i --)
result[j ++] = f[i];//将余数倒序排列得到二进制形式
result[j] = '\0';//手动给字符数组赋结束符
return 0;
}
int main()
{
int num, T;
scanf("%d", &T);
char result[1000];
while (T --)
{
scanf("%d", &num);
memset(result, 0, 1000);//作用是将某一块内存中的内容全部设置为指定的值,它是对较大的结构体或数组进行清零操作的一种最快方法
convert(num, result);
printf("%s\n", result);
}
return 0;
}
还有一种较局限的简易方法:
int n, m;
scanf("%d", &n);
int a[16] = {
0};
for (m = 0; m < 16; m ++)
{
a[m] = n % 2;
n = n / 2;
}
for (m = 15; m >= 0; m --)
{
printf("%d", a[m]);
if (m%4 == 0)
putchar(0);
}
3, 10进制转化为k进制
采用除k取余法
#include <stdio.h>
#include <string.h>
char ch[16] = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};//若余数比9大,(比如转为16进制)则需要引入字母来表示大于10的数(单独列出,巧妙!)
void convert(int n, int m, char result[])//结果是一个字符数组, 利用数组形参将结果保留
{
int i = 0, j = 0;
char f[1000] = {
'\0'};
//除k取余法
while(n/m != 0)//当商为0时(即整除结束时)结束循环
{
f[i ++] = ch[n % m];//直接将字符数组对应的元素赋给f
n = n / m;//n变为本次运算的商,准备进行下一次除法运算
}
f[i] = ch[n % m]; //同理,将最后一个余数存入数组
for(i = i; i >= 0; i -- )
result[j ++] = f[i];//将余数倒序排列即得进制转化后的数
result[j] = '\0';//别忘了字符数组末尾加上结束符
}
int main()
{
int n, m, T;
char result[1000];
scanf("%d", &T);
while (T --)
{
scanf("%d%d", &n, &m);
memset(result, 0, 1000);//清零数组
convert(n, m, result);
printf("%s\n", result);//结果是一个字符数组
}
return 0;
}
最简单、万能的方法:itoa函数
char *itoa(int value, char *string, int radix)
//value是一个十进制整数,string是转化为字符串后所存的数组,radix是要转化成的进制
int n, m;
scanf("%d%d", &n, &m);
char str[10];
itoa(n, str, m);//转化为m进制
printf("%s", str);