《算法笔记》3.5小节——入门模拟->进制转换
1941 Problem A 又一版 A+B
#include <stdio.h>
#include <string.h>
int main() {
int m;
long long a, b;
while (scanf("%d", &m) != EOF) {
if (m == 0) break;
//while(scanf("%d",&m) && m)
scanf("%lld %lld", &a, &b);
long long sum = a + b;
int ans[50] = { 0 };
int num = 0;
do {
ans[num++] = sum % m;
sum /= m;
} while (sum != 0);
//单独处理sum为0的情况,否则用do循环,先做一遍进制换算
//if(sum==0) { printf("0\n"); continue; }
for (int i = num - 1; i >= 0; i--) {
printf("%d", ans[i]);
}
//注意顺序是反的,从num-1开始
printf("\n");
}
return 0;
}
1942 Problem B 数制转换
#include <stdio.h>
#include <string.h>
int main() {
int a, b;
char n[50];
int m[50] = { 0 };
while (scanf("%d %s %d", &a, &n, &b) != EOF) {
int length = strlen(n);
long nnum = 0;
int temp;
for (int i = 0; i < length; i++) {
if (n[i] >= 'a') n[i] -= 32;
if (n[i] >= 'A') temp = (n[i]) - 'A' + 10;
else temp = n[i] - '0';
nnum = nnum * a + temp;
//数组转化为整数:每轮循环中,num=num*进制+a[i];
}
int cnt = 0;
do {
int temp;
temp = nnum % b;
nnum /= b;
if (temp >= 10) m[cnt++] = temp - 10 + 'A';
else m[cnt++] = temp + '0';
} while (nnum != 0);
for (int i = cnt - 1; i >= 0; i--) {
printf("%c", m[i]);
}
printf("\n");
}
return 0;
}
1943 Problem C 进制转换
不能直接用long long的整数,不够大,必须按位处理!
注意按位处理的方法!
#include<cstdio>
#include<cstring>
int main() {
//30位数字远远大于long long范围,因此必须按位处理
char a[35];
int anum[35] = { 0 };
int bnum[1000] = { 0 };
while (scanf("%s", &a) != EOF) {
int len = strlen(a);
for (int i = 0; i < len; i++) {
anum[i] = a[i] - '0';
}
int cnt = 0, n = 0;
//注意以下按位处理的方法!
while (n < len) {
bnum[cnt++] = anum[len - 1] % 2;
for (int i = n; i < len; i++) {
if (anum[i] % 2 == 1) anum[i + 1] += 10;
anum[i] /= 2;
}
if (anum[n] == 0) n++;
}
for (int i = cnt-1; i >=0; i--) {
printf("%d", bnum[i]);
}
printf("\n");
}
return 0;
}
1944 Problem D 八进制
#include<cstdio>
#include<cstring>
int main() {
long N = 0;
while (scanf("%d", &N) != EOF) {
int num[10000] = { 0 };
int cnt = 0;
do {
num[cnt++] = N % 8;
N /= 8;
} while (N != 0);
for (int i = cnt - 1; i >= 0; i--) {
printf("%d", num[i]);
}
printf("\n");
}
return 0;
}