问题5 进制转换

进制转换

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);

猜你喜欢

转载自blog.csdn.net/Shao_yihao/article/details/113702937