x转y进制模板
思路:x进制转10进制,10进制转y进制
#include <stdio.h>
#include <string.h>
int main() {
char s[105];
int x, y;
// 输入二进制字符串 和 代表的进制x 以及要转换的进制y
scanf("%s%d%d", &s, &x, &y);
// x进制转10进制
int ans = 0;
int len = strlen(s);
for (int i = 0; i < len; i++) {
ans = ans * x; // 注意是x
if (s[i] >= '0' && s[i] <= '9') ans += (s[i] - '0'); // 注意 - '0'
else ans += (s[i] - 'A') + 10; // 注意 - 10
}
// 10进制转y进制
if (ans == 0) { // 特判0
printf("0");
return 0;
}
char out[105];
int cnt = 0;
while (ans > 0) {
int w = (ans % y); // 注意 % y
if (w < 10) out[cnt++] = w + '0'; // 注意 + '0'
else out[cnt++] = (w-10) + 'A'; // 注意 - 10
ans /= y; // 注意是y
}
for (int i = cnt - 1; i >= 0; i--) { // 注意倒序输出
printf("%c", out[i]);
}
return 0;
}
十进制和二进制
这题涉及到高精度,建议多敲几遍,体会模拟列算式的过程
#define SUBMIT
#include <time.h>
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1005;
char ori[N];
int num[N], tr[N], ans[N];
int main() {
#ifdef SUBMIT
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
long _begin_time = clock();
#endif
while (~scanf("%s", ori)) {
// 记得清0
memset(tr, 0, sizeof tr);
memset(ans, 0, sizeof ans);
// char -> int
int len_ori = strlen(ori);
for (int i = 0; i < len_ori; i++) {
num[i] = ori[i] - '0';
}
// 10进制转2进制
int len_tr = 0;
int idx = 0;
while (idx < len_ori) {
tr[len_tr++] = num[len_ori - 1] % 2; // num整体除2的余数作为当前转换的结果
// num除2
int carry = 0;
for (int i = idx; i < len_ori; i++) {
int tmp = num[i] + carry;
if (tmp % 2) carry = 10; // 除法,当前位余数*10加到下一位上
else carry = 0;
num[i] = tmp / 2;
}
if (num[idx] == 0) idx++; // 最高位为0,看下一位
}
// for (int i = len_tr - 1; i >= 0; i--) {
// cout << tr[i];
// }
int len_ans = 1;
// 因为逆序,所以从0开始,将2进制转10进制
for (int i = 0; i < len_tr; i++) {
ans[0] = ans[0] * 2 + tr[i];
int carry = ans[0] / 10;
ans[0] %= 10;
// 从高位到低位,每一位都要相应乘2
for (int j = 1; j < len_ans; j++) {
ans[j] = ans[j] * 2 + carry;
carry = ans[j] / 10;
ans[j] %= 10;
}
// 在低位增补
while (carry) {
ans[len_ans++] = carry % 10;
carry /= 10;
}
}
// 逆序输出
for (int i = len_ans - 1; i >= 0; i--) {
cout << ans[i];
}
cout << endl;
}
#ifdef SUBMIT
long _end_time = clock();
printf("\n\ntime = %ld ms", _end_time - _begin_time);
#endif
return 0;
}
负二进制
C++中对于负数的除法是向0取整,而非向下取整,在负数时会出现问题
此题还要注意0的情况
#include <time.h>
#include <iostream>
#include <cstring>
using namespace std;
int ans[100];
int main() {
#ifdef SUBMIT
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
long _begin_time = clock();
#endif
int m;
while (~scanf("%d", &m)) {
if (m == 0) { // 注意特判为0的情况
cout << 0 << endl;
continue;
}
int len = 0;
while (m) { // C++对于负数的除法与一般设想不同,先去掉余数再除,确保整除
int rest = abs(m % -2);
ans[len++] = rest;
m = (m - rest) / -2;
}
for (int i = len - 1; i >= 0; i--)
cout << ans[i];
cout << endl;
}
#ifdef SUBMIT
long _end_time = clock();
printf("\n\ntime = %ld ms", _end_time - _begin_time);
#endif
return 0;
}