我说的是长度最多为 9999 个字符的数字,因此无需将其转换为十进制并将其放入 int 中。数字基数最多为 36,任何高于 9 的数字均按字母顺序用大写字母表示。我已经写了一些代码,但老实说我对如何继续只有一个非常模糊的想法。 base1 是输入数字的编号系统的基数,base2 决定要转换为哪个系统。
#include <stdio.h>
#include <stdlib.h>
#define LEN 1000
int exp(int expBase, int power){
unsigned int i=1;
int j;
for(j=0; j<power; j++) i*=expBase;
return i;
}
void convert(char* num, int base1, int base2, int length){
char numC[LEN];
int i;
}
int getNum(char *num){
int i=0;
char c;
while((c=fgetc(stdin)) != ' '){
num[i]=c;
i++;
}
return i;
}
int main(){
char num[LEN];
int n, base1, base2, length;
scanf("%d", &n);
for(int i=0; i<n;i++){
length=getNum(num);
scanf("%d %d", &base1, &base2);
convert(num, base1, base2, length);
}
return 0;
}
代码中可能有一些我没有注意到的错误,但这只是它的第一版,尚未经过正确测试,因此它们与手头的问题无关。感谢您的任何建议
如果您不想使用 Shawn 建议的库,则必须编写自己的模数和长除法函数。像这样的东西...(idivide函数看起来有点麻烦。)代码没有经过测试。
void touint8(char* num, uint8_t *numu8, int length) {
for(int i=0 ; i<length; i++) {
if (num[i] > 0x39) {
numu8[length - i] = num[i] - 0x41;
} else {
numu8[length - i] = num[i] - 0x30;
}
}
}
void fromuint8(uint8_t *numu8, char* num, int length) {
// Inverse of touint8.
}
void idivide(uint8_t *numu8, int *length, int base1, int divisor) {
// Perform integer long division of numu8 by divisor ...
// Overwrite numu8 with result.
}
_Bool allzeroes(uint8_t *numu8, int length) {
for(int i=0 ; i<length; i++) {
if (numu8[i]) return false;
}
return true;
}
int getlsigdigit(uint8_t *numu8, int length, int base1, int base2) {
int numbase2 = 0;
int x=1;
for(int i=0 ; i<length; i++) {
numbase2 = (numbase2 + numu8[i] * x) % base2;
x = (x*base1) % base2;
}
}
char* convert(char* num, int base1, int base2, int length) {
uint8_t *numu8 = malloc(length);
uint8_t *resu8 = malloc(LEN);
touint8(num, numu8, length);
int resdigit = 0;
while(!allzeroes(numu8, length)) {
resu8[resdigit] = getlsigdigit(numu8, length, base1, base2);
idivide(numu8, &length, base1, base2);
resdigit++;
}
char *res = malloc(reslen+1);
fromuint8(resu8, res, reslen);
free(numu8);
free(resu8);
return res;
}