鱼C论坛

 找回密码
 立即注册
查看: 994|回复: 2

[已解决]进制转换十进制转二进制(包括小数)

[复制链接]
发表于 2020-12-23 11:15:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 一世轻尘 于 2020-12-23 13:47 编辑

如下
最佳答案
2020-12-23 16:08:42
本帖最后由 jackz007 于 2020-12-23 16:20 编辑
#include <stdio.h>

//字符串倒序
void reverse(char s[])
{
        char c                                                                  ;
        int i , m                                                               ;
        for(m = 0 ; s[m] ; m ++)                                                ;
        for(i = 0 ; i < m / 2 ; i ++) {
                c = s[m - 1 - i]                                                ;
                s[m - 1 - i] = s[i]                                             ;
                s[i] = c                                                        ;
        }
}

// 从字符串 s 中按进制数 x(2 - 16)提取浮点数
float fromx(char s[] , int x)
{
        char c                                                                  ;
        int f , i , j , m                                                       ;
        float e , r                                                             ;
        const char b[] = {"0123456789abcdef"}                                   ;
        r = 0                                                                   ;
        if(x <= 16) {
                for(m = 0 ; s[m] ; m ++)                                        ;
                for(f = 1 , r = i = 0 ; i < m && s[i] != '.' && f ; i ++) {
                        c = s[i]                                                ;
                        if(c >= 'A' && c <= 'F') c += ' '                       ;
                        for(j = 0 ; j < x ; j ++) if(c == b[j]) break           ;
                        if(j < x) {
                                r = r * x + j                                   ;
                        } else {
                                r = f = 0                                       ;
                                break                                           ;
                        }
                }
                if(f) {
                        for(e = 1.0 / x , i ++ ; i < m ; e /= x , i ++) {
                                c = s[i]                                        ;
                                if(c >= 'A' && c <= 'F') c += ' '               ;
                                for(j = 0 ; j < x ; j ++) if(c == b[j]) break   ;
                                if(j < x) {
                                        r = r + j * e                           ;
                                } else {
                                        r = f = 0                               ;
                                }
                        }
                }
        }
        return r                                                                ;
}

// 将浮点数 z 转换为 x (2 - 16)进制字符串输出到字符串 t 中
char * tox(char t[] , float z , int x)
{
        const char b[] = {"0123456789abcdef"}                                   ;
        int d , i , m                                                           ;
        float f , r                                                             ;
        t[0] = '\0'                                                             ;
        if(x <= 16) { 
                d = z                                                           ;
                f = z - d                                                       ;
                for(i = 0 ; d ; d /= x , i ++) t[i] = b[d % x]                  ;
                t[i] = '\0'                                                     ;
                reverse(t)                                                      ;
                if(f >= 0.000001) {
                        if(! i) t[i ++] = '0'                                   ;
                        t[i ++] = '.'                                           ;
                        for(; f >= 0.000001 ; i ++) {
                                r = f * x                                       ;
                                d = r                                           ;
                                t[i] = b[d]                                     ;
                                f = r - d                                       ;
                        }
                        t[i] = '\0'                                             ;
                }
        }        
        return t                                                                ;
}

int main(void)
{
        char s[256] , t[256] , bin[256] , oct[256] , hex[256] ;
        int d                                                 ;
        float f                                               ;
        printf("键入十进制数:")                              ;
        scanf("%d" , & d)                                     ;
        printf("bin : %s\n" , tox(bin , d , 2))               ;
        printf("oct : %s\n" , tox(oct , d , 8))               ;
        printf("hex : %s\n" , tox(hex , d , 16))              ;
        printf("键入十进制数:")                              ;
        scanf("%f" , & f)                                     ;
        printf("bin : %s\n" , tox(bin , f , 2))               ;
        printf("oct : %s\n" , tox(oct , f , 8))               ;
        printf("hex : %s\n" , tox(hex , f , 16))              ;
        printf("键入二进制数:")                              ;
        scanf("%s" , bin)                                     ;
        printf("dec : %.0f\n" , fromx(bin , 2))               ;
        printf("键入二进制数:")                              ;
        scanf("%s" , bin)                                     ;
        printf("dec : %f\n" , fromx(bin , 2))                 ;
        printf("键入二进制数:")                              ;
        scanf("%s" , s)                                       ;
        printf("bin : %s\n" , tox(t , fromx(s , 2) , 2))      ;
        printf("qua : %s\n" , tox(t , fromx(s , 2) , 4))      ;
        printf("oct : %s\n" , tox(t , fromx(s , 2) , 8))      ;
        printf("dec : %s\n" , tox(t , fromx(s , 2) , 10))     ;
        printf("hex : %s\n" , tox(t , fromx(s , 2) , 16))     ;
        printf("键入十六进制数:")                            ;
        scanf("%s" , s)                                       ;
        printf("bin : %s\n" , tox(t , fromx(s , 16) , 2))     ;
        printf("qua : %s\n" , tox(t , fromx(s , 16) , 4))     ;
        printf("oct : %s\n" , tox(t , fromx(s , 16) , 8))     ;
        printf("dec : %s\n" , tox(t , fromx(s , 16) , 10))    ;
        printf("hex : %s\n" , tox(t , fromx(s , 16) , 16))    ;
}
        编译、运行实况:
D:\0002.Exercise\C>g++ -o fx2 fx2.c

D:\0002.Exercise\C>fx2
键入十进制数:235
bin : 11101011
oct : 353
hex : eb
键入十进制数:0.2357910
bin : 0.0011110001011100110011001
oct : 0.170563144
hex : 0.3c5ccc8
键入二进制数:10101101
dec : 173
键入二进制数:0.1110011
dec : 0.898438
键入二进制数:11101101
bin : 11101101
qua : 3231
oct : 355
dec : 237
hex : ed
键入十六进制数:12Def
bin : 10010110111101111
qua : 102313233
oct : 226757
dec : 77295
hex : 12def

D:\0002.Exercise\C>

        如你所见,这个程序可以对正的浮点数在 2 ~16 进制数之间任意转换。

        最后一个样例就是十六进制 12Def 的那一个,四进制数 1023233233 是错误的。正确的值应该是 102313233
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-23 16:08:42 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-12-23 16:20 编辑
#include <stdio.h>

//字符串倒序
void reverse(char s[])
{
        char c                                                                  ;
        int i , m                                                               ;
        for(m = 0 ; s[m] ; m ++)                                                ;
        for(i = 0 ; i < m / 2 ; i ++) {
                c = s[m - 1 - i]                                                ;
                s[m - 1 - i] = s[i]                                             ;
                s[i] = c                                                        ;
        }
}

// 从字符串 s 中按进制数 x(2 - 16)提取浮点数
float fromx(char s[] , int x)
{
        char c                                                                  ;
        int f , i , j , m                                                       ;
        float e , r                                                             ;
        const char b[] = {"0123456789abcdef"}                                   ;
        r = 0                                                                   ;
        if(x <= 16) {
                for(m = 0 ; s[m] ; m ++)                                        ;
                for(f = 1 , r = i = 0 ; i < m && s[i] != '.' && f ; i ++) {
                        c = s[i]                                                ;
                        if(c >= 'A' && c <= 'F') c += ' '                       ;
                        for(j = 0 ; j < x ; j ++) if(c == b[j]) break           ;
                        if(j < x) {
                                r = r * x + j                                   ;
                        } else {
                                r = f = 0                                       ;
                                break                                           ;
                        }
                }
                if(f) {
                        for(e = 1.0 / x , i ++ ; i < m ; e /= x , i ++) {
                                c = s[i]                                        ;
                                if(c >= 'A' && c <= 'F') c += ' '               ;
                                for(j = 0 ; j < x ; j ++) if(c == b[j]) break   ;
                                if(j < x) {
                                        r = r + j * e                           ;
                                } else {
                                        r = f = 0                               ;
                                }
                        }
                }
        }
        return r                                                                ;
}

// 将浮点数 z 转换为 x (2 - 16)进制字符串输出到字符串 t 中
char * tox(char t[] , float z , int x)
{
        const char b[] = {"0123456789abcdef"}                                   ;
        int d , i , m                                                           ;
        float f , r                                                             ;
        t[0] = '\0'                                                             ;
        if(x <= 16) { 
                d = z                                                           ;
                f = z - d                                                       ;
                for(i = 0 ; d ; d /= x , i ++) t[i] = b[d % x]                  ;
                t[i] = '\0'                                                     ;
                reverse(t)                                                      ;
                if(f >= 0.000001) {
                        if(! i) t[i ++] = '0'                                   ;
                        t[i ++] = '.'                                           ;
                        for(; f >= 0.000001 ; i ++) {
                                r = f * x                                       ;
                                d = r                                           ;
                                t[i] = b[d]                                     ;
                                f = r - d                                       ;
                        }
                        t[i] = '\0'                                             ;
                }
        }        
        return t                                                                ;
}

int main(void)
{
        char s[256] , t[256] , bin[256] , oct[256] , hex[256] ;
        int d                                                 ;
        float f                                               ;
        printf("键入十进制数:")                              ;
        scanf("%d" , & d)                                     ;
        printf("bin : %s\n" , tox(bin , d , 2))               ;
        printf("oct : %s\n" , tox(oct , d , 8))               ;
        printf("hex : %s\n" , tox(hex , d , 16))              ;
        printf("键入十进制数:")                              ;
        scanf("%f" , & f)                                     ;
        printf("bin : %s\n" , tox(bin , f , 2))               ;
        printf("oct : %s\n" , tox(oct , f , 8))               ;
        printf("hex : %s\n" , tox(hex , f , 16))              ;
        printf("键入二进制数:")                              ;
        scanf("%s" , bin)                                     ;
        printf("dec : %.0f\n" , fromx(bin , 2))               ;
        printf("键入二进制数:")                              ;
        scanf("%s" , bin)                                     ;
        printf("dec : %f\n" , fromx(bin , 2))                 ;
        printf("键入二进制数:")                              ;
        scanf("%s" , s)                                       ;
        printf("bin : %s\n" , tox(t , fromx(s , 2) , 2))      ;
        printf("qua : %s\n" , tox(t , fromx(s , 2) , 4))      ;
        printf("oct : %s\n" , tox(t , fromx(s , 2) , 8))      ;
        printf("dec : %s\n" , tox(t , fromx(s , 2) , 10))     ;
        printf("hex : %s\n" , tox(t , fromx(s , 2) , 16))     ;
        printf("键入十六进制数:")                            ;
        scanf("%s" , s)                                       ;
        printf("bin : %s\n" , tox(t , fromx(s , 16) , 2))     ;
        printf("qua : %s\n" , tox(t , fromx(s , 16) , 4))     ;
        printf("oct : %s\n" , tox(t , fromx(s , 16) , 8))     ;
        printf("dec : %s\n" , tox(t , fromx(s , 16) , 10))    ;
        printf("hex : %s\n" , tox(t , fromx(s , 16) , 16))    ;
}
        编译、运行实况:
D:\0002.Exercise\C>g++ -o fx2 fx2.c

D:\0002.Exercise\C>fx2
键入十进制数:235
bin : 11101011
oct : 353
hex : eb
键入十进制数:0.2357910
bin : 0.0011110001011100110011001
oct : 0.170563144
hex : 0.3c5ccc8
键入二进制数:10101101
dec : 173
键入二进制数:0.1110011
dec : 0.898438
键入二进制数:11101101
bin : 11101101
qua : 3231
oct : 355
dec : 237
hex : ed
键入十六进制数:12Def
bin : 10010110111101111
qua : 102313233
oct : 226757
dec : 77295
hex : 12def

D:\0002.Exercise\C>

        如你所见,这个程序可以对正的浮点数在 2 ~16 进制数之间任意转换。

        最后一个样例就是十六进制 12Def 的那一个,四进制数 1023233233 是错误的。正确的值应该是 102313233
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 23:30:53 | 显示全部楼层
已解决
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 08:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表