该程序接收两个数字b1(原始数字系统)和b2(您需要转换的数字)和一个数字X(最多 13 个字符),所有操作都将在该数字上执行。
很明显,首先需要转换X为十进制,并且整个部分的翻译执行没有问题。
(顺便说一句,她在这里)
//r1 - целая часть числа
//char X[13];
for (; X[i] != 0 && X[i] != '.'; i++) {
r1 = (('0' <= X[i] && X[i] <= '9') ? X[i]-'0' : (('A' <= X[i] && X[i] <= 'Z') ? X[i]-'A'+10 : (('a' <= X[i] && X[i] <= 'z') ? X[i]-'a'+10 : 0))) + r1*b1;
}
但是小数部分呢?(同样,不允许使用真实类型)
我认为将数字表示为普通分数(分子/分母)。
例如,将 0.34 从八进制转换为十进制如下所示:
3*8^(-1) + 4*8^(-2) = 8^(-2) * (3*8 + 4) = 28 / 64
但到目前为止,这个想法还没有什么明智的。
给我一个算法或解决这个问题的想法。
ps
我发布了一个示例算法。结果很笨拙,不太可行,而且不欢迎提升到权力来完成这项任务。但也许这会给某人一个正确的想法,他可以帮助我。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
int main(void) {
int p, tmp = 1, b1, b2, R1 = 0, R2 = 0, r1 = 0, r2 = 0, len, i = 0, j = 0, n = 1;
char X[13], ch;
scanf("%d",&b1);
scanf("%d",&b2);
scanf("%s", X); if (X[0]=='-') i++;
len = strlen(X);
for (; X[i] != 0 && X[i] != '.'; i++) r1 = (('0' <= X[i] && X[i] <= '9') ? X[i]-'0' : (('A' <= X[i] && X[i] <= 'Z') ? X[i]-'A'+10 : (('a' <= X[i] && X[i] <= 'z') ? X[i]-'a'+10 : 0))) + r1*b1;
printf("%d",r1 );
if (len == i) return 0;
else printf(".");
for (i++; X[i] != 0; i++, n = n*b1) r2 = (('0' <= X[i] && X[i] <= '9') ? X[i]-'0' : (('A' <= X[i] && X[i] <= 'Z') ? X[i]-'A'+10 : (('a' <= X[i] && X[i] <= 'z') ? X[i]-'a'+10 : 0))) + r2*b1; r2 = r2*10000000/n;
for( i = 0; i < 10; i++ ){
p = pow(10, floor(log10(abs(r2)))+1) ;
tmp = r2 * b2 / p;
r2 = r2 * b2 - tmp * p;
char ch = ((0 <= tmp && tmp <= 9) ? tmp+'0' : ((10 <= tmp && tmp <= 26) ? tmp +'A'-10 : 0));
printf("%c",ch );
}
return 0;
}
问题中用分母b1^n分解并表示为分数的想法是正确的,实现的想法也大体上是……但是亲爱的OP
p试图为魔术做什么分母( )我不敢弄清楚。在梳理的形式中,它看起来像这样: