(十二)王道机试指南___进制转换

算例一

  • 题目描述

  • 解题思路

①当要求十进制数x 的k 进制表示时,我们只需不断的重复对x求余(对k),求商(除以k),即可由低到高依次得到各个数位上的数。反过来,要求得由k 进制表示的数字的十进制值时,我们需要依次计算各个数位上的数字与该位权重的积(第n 位则权重为k n1 ),然后将它们依次累加即可得到该十进制值

  • 解题代码

#include <stdio.h>
int main() {
	long long a, b; //使用数据类型long long确保不会溢出
	int m;
	while (scanf("%d", &m) != EOF) {
		if (m == 0) break; //当m等于0时退出
		scanf("%lld%lld", &a, &b); //用%lld 对long long变量赋值
		a = a + b; //计算a+b
		int ans[50], size = 0; //ans用来保存依次转换得到的各个数位数字的值,size表示其个数
			do { //依次求的各个数位上的数字值
				ans[size++] = a % m; // 对m求模
				a /= m; // 除以m
			} while (a != 0); // 当a不为0时重复该过程
			for (int i = size - 1; i >= 0; i--) {
				printf("%d", ans[i]);
			} //输出,注意顺序为从高位到低位
			printf("\n"); //输出换行
	}
	return 0;
}
  • 注意点

①long范围为-2^63~2^63-1 ,虽然题面明确了输入数据将在int 范围内(<=2^31-1),但是两个int数字的和可能超过int所能表示的最大值,出现溢出。为了避免这种情况,采用long long来表示两个int数的和。如果用scanf和printf来输出long long,则使用转义字符%lld

 

 

算例二

  • 题目描述

  • 解题思路

①不同进制之间的转化通常从a进制转到10进制再转到b进制

  • 解题代码

#include <stdio.h>
#include <string.h>
int main() {
	int a, b;
	char str[40];
	while (scanf("%d%s%d", &a, str, &b) != EOF) {
		int tmp = 0, lenth = strlen(str), c = 1; / / tmp为我们将要计算的a进制对应的十进制数, lenth为字符串长度方便我们从低位到高位遍历每个数位上的数, c为各个数位的权重初始化为1, 表示最低位数位权重为1, 之后每位权重都是前一位权重的a倍
			for (int i = lenth - 1;i >= 0; i--) { //从低位到高位遍历每个数位上的数
				int x; //计算该位上数字
				if (str[i] >= '0' && str[i] <= '9') {
					x = str[i] - '0'; //当字符在0到9之间,计算其代表的数字
				}
				else if (str[i] >= 'a' && str[i] <= 'z') {
					x = str[i] - 'a' + 10; //当字符为小写字母时,计算其代表的数字
				}
				else {
					x = str[i] - 'A' + 10; //当字符为大写字母时,计算其代表的数字
				}
				tmp += x * c; // 累加该位数字与该数位权重的积
				c *= a; // 计算下一位数位权重
			}
		char ans[40], size = 0; //用ans保存转换到b进制的各个数位数字
		do {
			int x = tmp % b; //计算该位数字
			ans[size++] = (x < 10) ? x + '0' : x - 10 + 'A'; //将数字转换为字符
				tmp /= b;
		} while (tmp);
		for (int i = size - 1; i >= 0; i--) {
			printf("%c", ans[i]);
		}
		printf("\n"); //输出
	}
	return 0;
}
  • 注意点

①如何将A、a转换成对应的数字↑记一下!

②关于转换中,乘的a的x次方,可以用从0到x递增,每次乘a的方法累加计算

③高度浓缩型代码:ans[size++] = (x < 10) ? x + '0' : x - 10 + 'A';学习下,简洁有力

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值