| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5084 人关注过本帖
标题:任意进制数之间的转换
只看楼主 加入收藏
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
结帖率:93.33%
收藏
已结贴  问题点数:10 回复次数:30 
任意进制数之间的转换
程序代码:
#include<iostream>
#include<string>
using namespace std;
//任意进制之间的转换
/**
* s1  转换之前的数
* s2  转换之后的数
* d1  原进制数
* d2  需要转到的进制数
*     高于9的位数用大写'A'~'Z'表示,2~16位进制通过验证
*/
void conversion(string s1,string &s2,long d1,long d2){
    long i, j, t, num;
    char c;
    num = 0;
    for ( i = 0; i < s1.size(); i++){
        if (s1[i] >= '0'&&s1[i] <= '9'){
            t = s1[i] - '0';
        }
        else t = s1[i] - 'A' + 10;
            num = num*d1 + t;
     }
    i = 0;
    s2 = "";
    while (1){
        t = num%d2;
        num /= d2;
        if (t <= 9)s2 = to_string(t)+ s2;
        else s2 = (char)((t - 10 + 'A')) + s2;
        if (num == 0)break;
    }
}
int main(){
    string str1, str2;
    long d1, d2;
    while (cin >> str1 >> d1 >> d2){
        conversion(str1, str2,d1, d2);
        cout << str2 << endl;
    }
    return 0;
}

论坛还没有这样的东西,俺整了个试试,有点不对,是哪呢?
搜索更多相关主题的帖子: 任意 进制 转换 string num 
2018-05-19 20:17
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
围观

[此贴子已经被作者于2018-5-19 20:50编辑过]


https://zh.
2018-05-19 20:47
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:3 
程序代码:
#include <stdio.h>

int ToDecimal(const char* strSrc, long nSrcNum)
{
    int nRes = 0;
    char arrValue[127] = "";
    for(int i=0; i<10; ++i)
        arrValue[i + '0'] = i;
    for(int i=0; i<26; ++i)
        arrValue[i + 'A'] = i + 10;
        
    for(int i=0; strSrc[i]; ++i)
    {
        nRes = nRes * nSrcNum + arrValue[strSrc[i]];
    }
    return nRes;
}

void ReverseStr(char* str, int nLen)
{
    int i=0;
    while(i < nLen)
    {
        char tmp = str[i];
        str[i] = str[nLen];
        str[nLen] = tmp;
        ++i;
        --nLen;
    }
}

void Conversion(const char* strSrc, char* strDest, long nSrcNum, long nDestNum)
{
    const char* strBase = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int nSrc = ToDecimal(strSrc, nSrcNum);
    int nIndex = 0;
    while(nSrc)
    {
        strDest[nIndex++] = strBase[nSrc % nDestNum];
        nSrc /= nDestNum;
    }
    strDest[nIndex] = 0;
    ReverseStr(strDest, nIndex-1);
}

int main(int argc, char *argv[])
{
    char str[50];
    Conversion("171", str, 10, 36);
    puts(str);
    return 0;
}


转换的时候 有点小技巧
可以统一0~9 A~Z的转换形式
不用不停if

https://zh.
2018-05-19 21:12
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
你说有点不对
描述清楚

https://zh.
2018-05-19 21:15
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:3 
回复 3楼 lin5161678
这个程序是好,但有一个问题,高进制转换成低进制的时候可能会产生溢出,那看看这种情况怎么解决(当然可以另开一个数组保存,或者不改动直接说明要预留足够的进制转换空间)

PS:加上转换进制输入范围合法性判断增加一下健壮性也是可以的~

[此贴子已经被作者于2018-5-19 21:48编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-05-19 21:47
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
回复 5楼 九转星河
本来就是用另外的数组存结果的

https://zh.
2018-05-19 21:59
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
回复 5楼 九转星河
只考虑算法了 健壮性是另一个话题

https://zh.
2018-05-19 22:02
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
收藏
得分:0 
不考虑复杂了,需要转换的数,我们只考虑整数范围,小数暂时不作为考虑对象。这里我说的是任意进制的数,它可以是不小于2的任何数,比如可以是2进制数,可以是3进制数,可以是4进制数,可以是5进制数,等等。当然说明见下:
进制     所需符号
2进制数  0 1
3进制数  0 1 2
4进制数  0 1 2 3
5进制数  0 1 2 3 4
6进制数  0 1 2 3 4 5
7进制数  0 1 2 3 4 5 6
8进制数  0 1 2 3 4 5 6 7
9进制数  0 1 2 3 4 5 6 7 8  
10进制数 0 1 2 3 4 5 6 7 8 9
11进制数 0 1 2 3 4 5 6 7 8 9 A
12进制数 0 1 2 3 4 5 6 7 8 9 A B
13进制数 0 1 2 3 4 5 6 7 8 9 A B C
14进制数 0 1 2 3 4 5 6 7 8 9 A B C D
15进制数 0 1 2 3 4 5 6 7 8 9 A B C D E 
16进制数 0 1 2 3 4 5 6 7 8 9 A B C D E F
17进制数 0 1 2 3 4 5 6 7 8 9 A B C D E F G
18进制数 0 1 2 3 4 5 6 7 8 9 A B C D E F G H
19进制数 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I
.。。。。。
100进制数  ???????????????????????????????????????????????????????????
2018-05-19 22:31
lin5161678
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:45
帖 子:1136
专家分:3729
注 册:2011-12-3
收藏
得分:0 
回复 9楼 自学的数学
你说的A~Z 最高只支持到36
再多没符号了

https://zh.
2018-05-19 22:59
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
收藏
得分:0 
回复 9楼 lin5161678
你在定义数据时,可以把小写字母加进去,还可以罗马字母加进去,还可以
把希腊字母加进去,但是一定要说明清楚,不然就会乱了套。
2018-05-19 23:37
快速回复:任意进制数之间的转换
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.069712 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved