题目链接
第一次做时,单纯的利用了,先把m进制转成10进制,再将10进制转换为n进制的思路,且在考虑数据范围时过小,没有考虑到大整数的情况,所以没能ac;
#pragma warning(disable:4996);
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<time.h>
#include<stdlib.h>
using namespace std;
int main() {
int m, n;
while (scanf("%d%d", &m, &n) != EOF) {
getchar();
char str[100];
scanf("%s", str);
int len = strlen(str);
int ans = 0;int t = 1;
for (int i = len - 1;i >= 0;i--) {
if (str[i] <= 'Z' && str[i] >= 'A') {
ans += (str[i] - 'A'+10) * t;
}
else if (str[i] <= '9' && str[i] >= '0') {
ans+=(str[i] - '0' ) * t;
}
t *= m;
}//转换为10进制得数
//printf("%d", ans);
char a[100];
int i = 0;
while (ans) {
int temp = ans % n;
if (temp >= 10) {
a[i] = (temp - 10) + 'a';
i++;
}
else {
a[i] = temp + '0';
i++;
}
ans /= n;
}
for (int t = i - 1;t >= 0;t--) {
printf("%c", a[t]);
}
printf("\n");
}
return 0;
}
所以在这里不进行先转10再转n,直接进行转换就行了,只需要将模拟除法这一步稍加改动一下方可实现,不过在change函数里也需要改变,具体代码如下。
#pragma warning(disable:4996);
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<time.h>
#include<stdlib.h>
using namespace std;
struct bign { //存储大整数
int d[10000];
int len;
bign() {
memset(d, 0, sizeof(d));
len = 0;
}
};
bign change(char str[]) { //转换
bign a;
a.len = strlen(str);
for (int i = 0;i < a.len;i++) {
if (isdigit(str[a.len - 1 - i])) //0~9
a.d[i] = str[a.len - 1 - i] - '0';
else //A~Z
a.d[i] = str[a.len - 1 - i] - 'A' + 10;
}//把每一位所存数据都转换成数字型的
return a;
}
bign divide(bign a, int m, int b, int& r) {//r是引用变量,所以返回实参,作用域大,每次可返回值
bign c;
c.len = a.len;
r = 0;
for (int i = a.len - 1;i >= 0;i--) {
r = r * m + a.d[i]; //因为是m进制的,所以乘上m
if (r < b) c.d[i] = 0;
else { //相当于除k取余吧
c.d[i] = r / b;
r %= b;
}
}
while (c.len - 1 >= 1 && c.d[c.len - 1] == 0)
c.len--; //消除高位的0
return c;
}
int main()
{
int m, n, i, j, r;
char x[10000], ans[10000];
while (scanf("%d%d\n", &m, &n) != EOF) {
gets(x);
bign a = change(x);
r = 0;i = 0;
do {
a = divide(a, m, n, r);//利用每次返回的余数来得到n进制的值,a并没有作用,只是来接受一个bign型的数据而已,关键在于r的得到
if (r >= 0 && r <= 9) ans[i++] = r + '0';
else ans[i++] = r - 10 + 'a';
} while (!(a.d[0] == 0 && a.len == 1)); //当为0时退出循环
ans[i] = '\0';
for (j = i - 1;j >= 0;j--)
printf("%c", ans[j]);
printf("\n");
}
return 0;
}