浮点数整数的进制转换专题(各种小技巧)详细代码注释

按位取值

十进制转二进制

//十进制转二进制
#include <iostream>
using namespace std;

void printBinary(int val);

int main()
{
    int val;
    cin >> val;
    printBinary(val);
    return 0;
}


void printBinary(int val)
{
    int num[35];
    int j = -1;
    for (int i = 31; i >= 0; i--)
    {
        j++;
        if (val & (1 << i)) // 1 << i 表示二进制 1 向左移动 i 位, & 为位运算符
            //cout << "1";
            //cin >> num[j];
            num[j] = 1;
        else
           num[j] = 0;
    }
    int jBack = j; 
    int flag = 1; // 标记开头多余的0(不需要输出二进制开头的0)
    for(j = 0; j <= jBack; j++){
        if(flag == 1) {
            if(num[j] == 0) continue;
            else {
                cout << num[j];
                flag = 0;
            }
        }
        else cout << num[j];
    }
    cout << endl;
}

输出结果

在这里插入图片描述

十进制转八进制

代码&注释

//十进制转八进制
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    cout << "Input a number:" << endl;
    unsigned int d;
    vector<int> ivec; // vector 一种容器,这里用来装 int 值

    cin >> d;
    int dBack = d; // 用来备份输入的 d
    while (d)
    {
        ivec.push_back(d % 8); // 得到得值存到 ivec 中
        d = d / 8; // d % 8 循环计算,依次得到对应的 8 进制值,然后通过计算 d / 8 计算下一位
    }
    if (dBack == 0) { // 当输入为 0 时执行的操作
        cout << 0 << endl;
    }
    else {
        cout << "The octal result is:" << endl;
        for (vector<int>::iterator itr = ivec.end() - 1; itr >= ivec.begin();) // 遍历取出所有元素
        {
            cout << *itr--;
        }
        cout << endl;
    }

    return 0;
}

输出结果

在这里插入图片描述

十进制转多种进制

十进制转换为任意进制的源码

代码&注释

//十进制转换为任意进制的源码
#include <iostream>
using namespace std;

int main()
{
    int n;
    int num_sys, rem, m = 0, s[32];
    cout << "输入要转换的数字:" << endl;
    cin >> n;
    cout << "输入要转换的进制:" << endl;
    cin >> num_sys;

    cout << "( " << n << " )10 = "
         << "( ";

    while (n != 0) //数制转换,结果存入数组s[m]
    {
        rem = n % num_sys;
        n = n / num_sys;
        s[m++] = rem; //将余数按顺序存入数组s[m]中
    }
    m--;
    for (int k = m; k >= 0; k--) //输出转换后的序列
    {
        if (s[k] >= 10) //若为十六进制等则输出相对应的字母
            cout << (char)(s[k] + 55); // 10用A表示,A对应的ASCII值为65(等于55 + 10)
        else //否则直接输出数字
            cout << s[k];
    }

    cout << " )" << num_sys << endl;

    return 0;
}

输出结果

在这里插入图片描述

用C++自带方法输出进制

代码&注释

#include <iostream>
#include <bitset> //输出二进制的头文件
using namespace std;

int main()
{
    // cin >> oct >> test; //输入为八进制数
    // cin >> hex >> test; //输入为十六进制数
    int test;
    cin >> test;

    //cout << test << endl;
    cout << "二进制: " << bitset<32>(test) << endl;
    cout << "OCT: " << oct << test << endl; //八进制
    cout << "HEX: " << hex << test << endl; //十六进制
    cout << dec;                    //恢复十进制输出状态
    cout << "DEC: " <<  test << endl;

    return 0;
}

输出「浮点数」的进制转化

代码&注释



#include <iostream>
#include <cmath>
using namespace std;

void intPart(int dec_val, int n);
void floatPart(double dec_val, int n);
void intOrFloa(double dec_val, int n);
void toBOH(char ch[], double dec_val);
double toDec(char ch[], int n);

int main()
{
    cout << "           进制转换\n";
    char ch[100];
    int n;
    cout << "\n 输入整数,和它现在使用的进制: ";
    cin >> ch >> n;
    cout << endl;
    toBOH(ch, toDec(ch, n)); // toDec 返回 10 进制值

    return 0;
}

/*
十进制转换为二进制思想简述:
1.迭代到最底层,最底层的余数就是最高位,最底层没有余数;
2.依次往顶层递归,每一次的余数就是其底层的低位,其上层的高位;
3.调用进行到 if 选择输出,则那一次调用可以结束,逐阶往上层返回,并
 进行上一层的输出语句,又一层调用结束,然后再往上返回,依次进行
*/
//转整数部分
void intPart(int dec_val, int n)
{
    if (dec_val)
    {
        intPart(dec_val / n, n);
        if (n < 10)
            cout << dec_val % n;
        else
            dec_val % n >= 10 ? cout << char(dec_val % n - 10 + 'A') : cout << dec_val % n;
    }
}

//转小数部分
void floatPart(double dec_val, int n)
{
    while (dec_val)
    {
        if (n < 10)
            cout << int(dec_val * n);
        else
            dec_val * n >= 10 ? cout << char(int(dec_val * n) - 10 + 'A') : cout << int(dec_val * n);
        dec_val = dec_val * n - int(dec_val * n); // 得到的乘积减去整数部分,所的差赋值给 dec_val , 用于下一次循环
    }
}

// 对整数或小数的操作(加小数点)
void intOrFloa(double dec_val, int n)
{
    intPart(dec_val, n);
    if (int(dec_val) == dec_val)
        return;
    cout << '.';
    dec_val -= int(dec_val); // 得到小数部分
    floatPart(dec_val, n);
}

// 输出三种进制
void toBOH(char ch[], double dec_val)
{
    cout << ' ' << ch << " 转换成" << 2 << "进制 = ";
    intOrFloa(dec_val, 2);
    cout << endl;
    cout << ' ' << ch << " 转换成" << 8 << "进制 = ";
    intOrFloa(dec_val, 8);
    cout << endl;
    cout << ' ' << ch << " 转换成" << 16 << "进制 = ";
    intOrFloa(dec_val, 16);
    cout << endl;
}

// 对输入的数,进行得到10进制值的处理
double toDec(char ch[], int n)
{
    char ch_cpy[100];
    int i = 0, j;
    double dec_val = 0;
    cout << ' ' << ch << " 转换成10进制 = ";
    while (*ch != '.' && *ch != '\0') // 读取到小数点,或者结束的位置
        ch_cpy[i++] = *ch++;
    i--;
    if (*ch == '\0') // 如果有小数点,则读到了小数点的位置,这一步就不用执行
        ch--;
    // 计算整数部分
    for (j = 0; j <= i; j++) // '.'为小数点,它的值为46
        if (ch_cpy[j] < 65) // A 的值为 65, 当小于 65 时,可以判断该字符为小于 10 的数字字符
            dec_val += (ch_cpy[j] - 48) * pow(n, i - j); // 0 的值为 48(得到对应的数字)(比如 '0' - 48 = 0)
        else
            dec_val += (ch_cpy[j] - 55) * pow(n, i - j); // 当字符的值大于等于55, 可以判断为大于10的进制的数字字符,相减得到对应的数

    // 计算小数部分值(两部分的值加起来)
    for (ch++, j = -1; *ch != '\0'; ch++, j--) // ch++ 越过小数点
        if (*ch < 65)
            dec_val += (*ch - 48) * pow(n, j);
        else
            dec_val += (*ch - 55) * pow(n, j);
    cout << dec_val << endl;
    return dec_val;
}

运行结果

在这里插入图片描述

总结

要学的东西很多,但是最重要的就是算法编程实践 oj数学训练,加油,全力冲刺 AC, OJ, MATH!为金牌而战!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值