注意:这个是小数点后的进制转化,小数点前后是有不同的
给你任意进制的数转化成另一进制的数,我的确无法证明累除法的正确性,但是我已经掌握了他的使用方法及原理:
就拿此题为例:
我们是八进制转化为十进制,我直接给出求解的步骤及过程:
现在我们有一个8进制的字符串:
0.a[1] a[2] a[3] a[4] a[5] ...... a[n]
我们在设个数组用于存储转化后的十进制字符串,设为b[],大小假设为m
那么就得到等式:
0.a[1] a[2] a[3] a[4] a[5] ...... a[n](8进制)= b[1]*10^-1+b[2]*10^-2+b[3]*10^-3+......+b[m]*10^-m(10进制);
那么我们就在两边同时乘以10,结论就是左边序列个位数就是b[1],再乘以十左边个位数就是b[2],......依次进行
下去,直到左边为0结束。
我们设个进位的变量pre
状态转移式为:a[i]=(a[i]*10+pre)%8; b[i]=(a[i]*10+pre)/8;
那么按此理即可推出结果:
代码如下:
/*
* File: main.cpp
* Author: 6100300115
*
* Created on 2012年3月3日, 下午6:25
*/
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
const int MAX = 10001;
int hex1[MAX]; //存储8进制的数
int dig[MAX]; //存储10进制的数
/*
* 小数部分,basea进制到baseb进制之间的转化
* 返回值baseb进制数b[]的长度
* 下标从0开始
*/
int change(int a[], int basea, int sizea, int b[], int baseb) {
int starta = sizea - 1; //保存非0末尾的位置
int pre; //存储进位
bool judge;
int k;
for (k = 0;; k++) {
pre = 0;
judge = false;
for (int i = starta; i >= 0; i--) {
int temp = (a[i] * baseb + pre);
a[i] = temp % basea;
pre = temp / basea;
if (judge == false && a[i] != 0) {
judge = true;
starta = i;
}
}
b[k] = pre;
if (judge == false) break;
}
return k + 1;
}
int main() {
string s;
while (cin >> s) {
int size = s.size();
for (int i = 2; i < size; i++) {
hex1[i - 2] = int(s[i] - '0');
}
size = change(hex1, 8, size - 2, dig, 10);
cout << s << " [8] = 0.";
for (int i = 0; i < size; i++) {
cout << dig[i];
}
cout << " [10]\n";
}
return 0;
}