1. 输入一个十进制的数,把它变成八进制,类似的把十进制变成16进制,把十六进制转变为十进制等。
思路:
十进制 -> Q进制:依次取余数,存到数组中,最后从后往前输出数组的值
Q进制 -> 十进制:依次取每位乘当前的权,然后累加到初值为0的十进制y中。
代码:
十进制转换为 八进制:
// 十进制转为八进制,除基取余法
#include <cstdio>
int main() {
int n, p = 8;
scanf("%d", &n); // 输出十进制数n
int z[40], pNum = 0; // 存放余数的数组和下标
// 每次取一个余数,然后 n再取商
while (n != 0) {
z[pNum++] = n % p;
n /= p;
}
// 逆序输出余数数组中的余数
for (int i = pNum - 1; i >= 0; i--) {
printf("%d", z[i]);
}
return 0;
}
十进制 转换为 十六进制:
// 十进制 转换为 十六进制
#include <cstdio>
char hexa[6] = { 'A', 'B', 'C', 'D', 'E', 'F' };
int main() {
int n; // 十进制数n
scanf("%d", &n);
int p = 16; // 要转换的进制
char z[40], pNum = 0; //存放余数的数组和下标
while (n != 0) {
int remain = n % p; //取余数
if (remain >= 10 && remain <= 15)
z[pNum++] = hexa[remain - 10];
else
z[pNum++] = '0' + remain;
n /= p; // 取商
}
for (int i = pNum-1; i >= 0; i--) {
printf("%c", z[i]);
}
return 0;
}
十六进制 转换为 十进制:
// 十六进制 转 十进制
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main() {
char num[10];
scanf("%s", num);
int len = strlen(num);
int product = 1;
int p = 16; // 权重
int ans = 0; // 存放结果
// 十六进制数字的个位往前遍历,每个数字乘以权重,每循环依次,权重乘权
for (int i = len - 1; i >= 0; i--) {
if (num[i] >= 'A' && num[i] <= 'F') {
ans += (num[i] - 'A' + 10) * product;
}
else {
ans += (num[i] - '0') * product;
}
product *= p;
}
printf("%d\n", ans);
return 0;
}
2. 大整数相加
输入两个非常大的整数(完全超出了int、long的标识范围),这个整数的长度可能超过100位,计算并输出这两个数相加的结果。
参考:《算法笔记》5.6 大整数运算
思路:
设置一个大整数结构体 bign,有2个元素:
数组d[]逆序存放大整数,因为运算的时候是从后往前,所以逆序存放有助于运算;
int型 len 表示这个大整数的长度。
因int和long都不能满足 大整数的存放,所以用字符数组存放。然后再转换成结构体,逆序存入数组。
加法:
定义一个add函数,参数为两个结构体。核心思想:对应位相加,个位数作为当前位的结果,进位记录下来,再加到下一个对应位相加中。
#include <cstdio>
#include <cstring>
struct bign {
int d[1010];
int len;
bign() { // 初始化函数
memset(d, 0, sizeof(d));
len = 0;
}
};
bign change(char str[]) {
bign a;
int len = strlen(str);
for (int i = 0; i < len; i++) {
a.d[a.len++] = str[len - 1 - i] - '0';
}
return a;
}
bign add(bign a, bign b) {
bign c;
int carry = 0;
for (int i = 0; i < a.len || i < b.len; i++) {
int temp = a.d[i] + b.d[i] + carry;
c.d[c.len++] = temp % 10;
carry = temp / 10;
}
if (carry != 0) {
c.d[c.len++] = carry;
}
return c;
}
int main() {
char num1[1010], num2[1010];
scanf("%s%s", num1, num2);
bign a = change(num1);
bign b = change(num2);
bign c = add(a, b);
for (int i = c.len - 1; i >= 0; i--) {
printf("%d", c.d[i]);
}
return 0;
}