算例一
-
题目描述
-
解题思路
①当要求十进制数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';学习下,简洁有力