x转y进制模板
思路:x进制转10进制,10进制转y进制
#include <stdio.h>#include <string.h>int main() {char s[105];int x, y;// 输入二进制字符串 和 代表的进制x 以及要转换的进制yscanf("%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; // 注意是xif (s[i] >= '0' && s[i] <= '9') ans += (s[i] - '0'); // 注意 - '0'else ans += (s[i] - 'A') + 10; // 注意 - 10}// 10进制转y进制if (ans == 0) { // 特判0printf("0");return 0;}char out[105];int cnt = 0;while (ans > 0) {int w = (ans % y); // 注意 % yif (w < 10) out[cnt++] = w + '0'; // 注意 + '0'else out[cnt++] = (w-10) + 'A'; // 注意 - 10ans /= 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 SUBMITfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);long _begin_time = clock();#endifwhile (~scanf("%s", ori)) {// 记得清0memset(tr, 0, sizeof tr);memset(ans, 0, sizeof ans);// char -> intint 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除2int 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;// 从高位到低位,每一位都要相应乘2for (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 SUBMITlong _end_time = clock();printf("\n\ntime = %ld ms", _end_time - _begin_time);#endifreturn 0;}
负二进制
C++中对于负数的除法是向0取整,而非向下取整,在负数时会出现问题
此题还要注意0的情况
#include <time.h>#include <iostream>#include <cstring>using namespace std;int ans[100];int main() {#ifdef SUBMITfreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);long _begin_time = clock();#endifint 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 SUBMITlong _end_time = clock();printf("\n\ntime = %ld ms", _end_time - _begin_time);#endifreturn 0;}
