HOJ Octal Fractions——进制转化复习及模版补充

来源:互联网 发布:游戏本 知乎 编辑:程序博客网 时间:2024/06/12 09:28

注意:这个是小数点后的进制转化,小数点前后是有不同的

给你任意进制的数转化成另一进制的数,我的确无法证明累除法的正确性,但是我已经掌握了他的使用方法及原理:

就拿此题为例:

我们是八进制转化为十进制,我直接给出求解的步骤及过程:

现在我们有一个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;
}



原创粉丝点击