鱼C论坛

 找回密码
 立即注册
查看: 1110|回复: 5

[已解决]题目2 进制转换

[复制链接]
发表于 2020-12-22 18:53:50 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 一世轻尘 于 2020-12-22 18:55 编辑

求助2
最佳答案
2020-12-22 19:22:40
本帖最后由 风过无痕1989 于 2020-12-23 13:17 编辑

我晕,我选了一个最不好做的题目
// 十进制数转换为二进制数
#include <stdio.h>

char binaryNum[30];                   // 存放转换后得到的字符二进制码
int n, count = 0;                     // 计数十进制整数被2除的次数
int binary_num[30];                   // 存放转换过程中的数字二进制码

void main()
{
        int i, num;
        printf("输入一个十进制的整数:");
        scanf("%d", &num);

        while ((num / 2) != 1)           // 判断条件为:除以2之后的商不等于1
        {
                binary_num[count] = num % 2;  // 取余后的数字存入数组
                num /= 2;                     // num = num/2; 进行下一轮的判断
                count++;                      // 此变量用来指定数组下标
        }
        binary_num[count + 1] = 1;        // 最后一次除法做完以后,剩下的商一定是1,所以在最后手动添加一个1
        
        printf("二进制数值为:");
        for (i = count; i >= 0; i--)
        {
                binaryNum[i] = binary_num[i] + '0';
                printf("%c", binaryNum[i]);
        }
        printf("\n");
}
// 二进制数转换为十进制数
#include<stdio.h>
#include<math.h>
int main()
{
        int i = 0, j, k, l, m, n, num = 0;
        double sum = 0;
        printf("请输入二进制数的位数:");
        scanf("%d", &n);
        char ch, binaryNum[21];                 // 对于支持C99的编译器,元素个数用n
        while ((ch = getchar()) != '\n')        // 输入二进制数
        {
                binaryNum[i] = ch;
                i++;
        }
        n = i;
        
        // 二进制转十进制
        for(i = 0;i < 20;i++)
        {
                if(binaryNum[i] != '0')
                sum += pow(2,(20 - i - 1));
        }
        printf("转换成十进制数为:");
        printf("%lf\n", sum);
        
}
// 二进制数转换成八进制数、十六进制数
#include<stdio.h>
#include<math.h>
int main()
{
        int i = 0, j, k, m, n = 20, num = 0;
        double sum = 0;
         printf("请输入二进制数的位数:");
        scanf("%d", &n);
        getchar(); 
        char ch, binaryNum[21];           // 对于支持C99的编译器,元素个数用n
        char binary_Num[21];              // 存放反序的二进制数
        char Num8[21];                    // 存放八进制数
        char Num16[21];                   // 存放十六进制数
         while ((ch = getchar()) != '\n')  // 输入二进制数
        {
                binaryNum[i] = ch;
                i++;
        }
        n = i; 
        printf("输入的二进制数为:");
        for (i = 0;i < n;i++)
        {
                if (i % 4 != 0)
                {
                        printf("%c", binaryNum[i]);
                }
                else
                {
                        printf(" ");
                        printf("%c", binaryNum[i]);
                }
        }
        printf("\n");

        // 二进制数组反序
        i = 0;
        while ((n - i) > 0)
        {
                binary_Num[i] = binaryNum[n - i - 1];
                i++;
        }
        binary_Num[n] = '\0';

        // 二进制转八进制
        k = 0;
        for (i = 0;i < n;i += 3)
        {
                for(j = 0;j < 3;j++)
                {
                    m = binary_Num[i + j] - '0';      // 将字符转换为数字
                    if (j == 0 && (m == 0 || m == 1)) // 多加的m条件是防止结束符参与计算
                            num = m * 1;
                    if (j == 1 && (m == 0 || m == 1))
                            num += m * 2;
                    if (j == 2 && (m == 0 || m == 1)) 
                            num += m * 4;
                }
                ch = num + '0';                     // 将数字转换为字符
                Num8[k] = ch;
                num = 0;
                k++;
        }
        Num8[k] = '\n';

        i = 0;                                  // 将反序的8进制数再反序回来
        while ((k - i) > k / 2)
        {
                ch = Num8[i];
                Num8[i] = Num8[k - i - 1];
                Num8[k - i - 1] = ch;
                i++;
        }

        printf("转换为8进制数为:");
        for (i = 0;i < k;i++)
                printf("%c", Num8[i]);
        printf("\n");

        // 二进制转十六进制
        k = 0;
        for (i = 0;i < n;i += 4)
        {
                for (j = 0;j < 4;j++)
                {
                        m = binary_Num[i + j] - '0';      // 将字符转换为数字
                        if (j == 0 && (m == 0 || m == 1)) // 多加的m条件是防止结束符参与计算
                                num = m * 1;
                        if (j == 1 && (m == 0 || m == 1))
                                num += m * 2;
                        if (j == 2 && (m == 0 || m == 1))
                                num += m * 4;
                        if (j == 3 && (m == 0 || m == 1))
                                num += m * 8;
                }
                if (num >= 10 && num <= 16)           // 将数字转换为字符
                        ch = (num - 10) + 'A';
                else
                    ch = num + '0';
                Num16[k] = ch;
                num = 0;
                k++;
        }
        Num16[k] = '\n';

        i = 0;                                  // 将反序的16进制数再反序回来
        while ((k - i) > k / 2)
        {
                ch = Num16[i];
                Num16[i] = Num16[k - i - 1];
                Num16[k - i - 1] = ch;
                i++;
        }

        printf("转换为16进制数为:");
        for (i = 0;i < k;i++)
                printf("%c", Num16[i]);
        printf("\n");
}
2.png

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-12-22 19:22:40 | 显示全部楼层    本楼为最佳答案   
本帖最后由 风过无痕1989 于 2020-12-23 13:17 编辑

我晕,我选了一个最不好做的题目
// 十进制数转换为二进制数
#include <stdio.h>

char binaryNum[30];                   // 存放转换后得到的字符二进制码
int n, count = 0;                     // 计数十进制整数被2除的次数
int binary_num[30];                   // 存放转换过程中的数字二进制码

void main()
{
        int i, num;
        printf("输入一个十进制的整数:");
        scanf("%d", &num);

        while ((num / 2) != 1)           // 判断条件为:除以2之后的商不等于1
        {
                binary_num[count] = num % 2;  // 取余后的数字存入数组
                num /= 2;                     // num = num/2; 进行下一轮的判断
                count++;                      // 此变量用来指定数组下标
        }
        binary_num[count + 1] = 1;        // 最后一次除法做完以后,剩下的商一定是1,所以在最后手动添加一个1
        
        printf("二进制数值为:");
        for (i = count; i >= 0; i--)
        {
                binaryNum[i] = binary_num[i] + '0';
                printf("%c", binaryNum[i]);
        }
        printf("\n");
}
// 二进制数转换为十进制数
#include<stdio.h>
#include<math.h>
int main()
{
        int i = 0, j, k, l, m, n, num = 0;
        double sum = 0;
        printf("请输入二进制数的位数:");
        scanf("%d", &n);
        char ch, binaryNum[21];                 // 对于支持C99的编译器,元素个数用n
        while ((ch = getchar()) != '\n')        // 输入二进制数
        {
                binaryNum[i] = ch;
                i++;
        }
        n = i;
        
        // 二进制转十进制
        for(i = 0;i < 20;i++)
        {
                if(binaryNum[i] != '0')
                sum += pow(2,(20 - i - 1));
        }
        printf("转换成十进制数为:");
        printf("%lf\n", sum);
        
}
// 二进制数转换成八进制数、十六进制数
#include<stdio.h>
#include<math.h>
int main()
{
        int i = 0, j, k, m, n = 20, num = 0;
        double sum = 0;
         printf("请输入二进制数的位数:");
        scanf("%d", &n);
        getchar(); 
        char ch, binaryNum[21];           // 对于支持C99的编译器,元素个数用n
        char binary_Num[21];              // 存放反序的二进制数
        char Num8[21];                    // 存放八进制数
        char Num16[21];                   // 存放十六进制数
         while ((ch = getchar()) != '\n')  // 输入二进制数
        {
                binaryNum[i] = ch;
                i++;
        }
        n = i; 
        printf("输入的二进制数为:");
        for (i = 0;i < n;i++)
        {
                if (i % 4 != 0)
                {
                        printf("%c", binaryNum[i]);
                }
                else
                {
                        printf(" ");
                        printf("%c", binaryNum[i]);
                }
        }
        printf("\n");

        // 二进制数组反序
        i = 0;
        while ((n - i) > 0)
        {
                binary_Num[i] = binaryNum[n - i - 1];
                i++;
        }
        binary_Num[n] = '\0';

        // 二进制转八进制
        k = 0;
        for (i = 0;i < n;i += 3)
        {
                for(j = 0;j < 3;j++)
                {
                    m = binary_Num[i + j] - '0';      // 将字符转换为数字
                    if (j == 0 && (m == 0 || m == 1)) // 多加的m条件是防止结束符参与计算
                            num = m * 1;
                    if (j == 1 && (m == 0 || m == 1))
                            num += m * 2;
                    if (j == 2 && (m == 0 || m == 1)) 
                            num += m * 4;
                }
                ch = num + '0';                     // 将数字转换为字符
                Num8[k] = ch;
                num = 0;
                k++;
        }
        Num8[k] = '\n';

        i = 0;                                  // 将反序的8进制数再反序回来
        while ((k - i) > k / 2)
        {
                ch = Num8[i];
                Num8[i] = Num8[k - i - 1];
                Num8[k - i - 1] = ch;
                i++;
        }

        printf("转换为8进制数为:");
        for (i = 0;i < k;i++)
                printf("%c", Num8[i]);
        printf("\n");

        // 二进制转十六进制
        k = 0;
        for (i = 0;i < n;i += 4)
        {
                for (j = 0;j < 4;j++)
                {
                        m = binary_Num[i + j] - '0';      // 将字符转换为数字
                        if (j == 0 && (m == 0 || m == 1)) // 多加的m条件是防止结束符参与计算
                                num = m * 1;
                        if (j == 1 && (m == 0 || m == 1))
                                num += m * 2;
                        if (j == 2 && (m == 0 || m == 1))
                                num += m * 4;
                        if (j == 3 && (m == 0 || m == 1))
                                num += m * 8;
                }
                if (num >= 10 && num <= 16)           // 将数字转换为字符
                        ch = (num - 10) + 'A';
                else
                    ch = num + '0';
                Num16[k] = ch;
                num = 0;
                k++;
        }
        Num16[k] = '\n';

        i = 0;                                  // 将反序的16进制数再反序回来
        while ((k - i) > k / 2)
        {
                ch = Num16[i];
                Num16[i] = Num16[k - i - 1];
                Num16[k - i - 1] = ch;
                i++;
        }

        printf("转换为16进制数为:");
        for (i = 0;i < k;i++)
                printf("%c", Num16[i]);
        printf("\n");
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-12-22 21:02:35 | 显示全部楼层
本帖最后由 jackz007 于 2020-12-22 21:13 编辑
#include <stdio.h>
#include <string.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            ;
        }
}

// 二进制字符串转换为整型数
int frombin(char s[])
{
        int i , m  , r                                       ;
        for(m = 0 ; s[m] ; m ++)                             ;
        for(r = i = 0 ; i < m ; i ++) r = r * 2 + s[i] - '0' ;
        return r                                             ;
}

// 八进制字符串转换为整型数
int fromoct(char s[])
{
        int i , m  , r                                       ;
        for(m = 0 ; s[m] ; m ++)                             ;
        for(r = i = 0 ; i < m ; i ++) r = r * 8 + s[i] - '0' ;
        return r                                             ;
}

// 十六进制字符串转换为整型数
int fromhex(char s[])
{
        int i , m  , r                                       ;
        char c                                               ;
        for(m = 0 ; s[m] ; m ++)                             ;
        for(r = i = 0 ; i < m ; i ++) {
                c = s[i]                                     ;
                if(c >= 'A' && c <= 'F') c += ' '            ;
                if(c > '9') c = 10 + c - 'a'                 ;
                else c = c - '0'                             ;
                r = r * 16 + c                               ;
        }
        return r                                             ;
}

//整型数转换为二进制字符串
char * tobin(char s[] , int d)
{
        int i , m                                            ;
        for(i = 0 ; d ; d /= 2 , i ++) s[i] = (d % 2) + '0'  ;
        s[i] = '\0'                                          ;
        reverse(s)                                           ;
        return s                                             ;
}

//整型数转换为八进制字符串
char * tooct(char s[] , int d)
{
        int i , m                                            ;
        for(i = 0 ; d ; d /= 8 , i ++) s[i] = (d % 8) + '0'  ;
        s[i] = '\0'                                          ;
        reverse(s)                                           ;
        return s                                             ;
}

//整型数转换为十六进制字符串
char * tohex(char s[] , int d)
{
        char c                                               ;
        int i , m                                            ;
        for(i = 0 ; d ; d /= 16 , i ++) {
                c = d % 16                                   ;
                if(c > 9) s[i] = c - 10 + 'a'                ;
                else s[i] = c + '0'                          ;
        }
        s[i] = '\0'                                          ;
        reverse(s)                                           ;
        return s                                             ;
}

// 二进制字符串到八进制字符串转换
// s[]- 二进制字符串输入 ,t[] - 八进制字符串输出
char * bin2oct(char s[] , char t[])
{
        return tooct(t , frombin(s))                         ;
}

// 八进制字符串到十六进制字符串转换
// s[]- 八进制字符串输入 ,t[] - 十六进制字符串输出
char * bin2hex(char s[] , char t[])
{
        return tohex(t , frombin(s))                         ;
}

// 八进制字符串到二进制字符串转换
// s[]- 八进制字符串输入 ,t[] - 二进制字符串输出
char * oct2bin(char s[] , char t[])
{
        return tobin(t , fromoct(s))                         ;
}

// 八进制字符串到十六进制字符串转换
// s[]- 八进制字符串输入 ,t[] - 十六进制字符串输出
char * oct2hex(char s[] , char t[])
{
        return tohex(t , fromoct(s))                         ;
}

// 十六进制字符串到二进制字符串转换
// s[]- 十六进制字符串输入 ,t[] - 二进制字符串输出
char * hex2bin(char s[] , char t[])
{
        return tobin(t , fromhex(s))                         ;
}

// 十六进制字符串到八进制字符串转换
// s[]- 十六进制字符串输入 ,t[] - 八进制字符串输出
char * hex2oct(char s[] , char t[])
{
        return tooct(t , fromhex(s))                         ;
}

int main(void)
{
        char s[256] , t[256]                                 ;
        int d                                                ;
        strcpy(s , "10101010")                               ;
        printf("bin : %s\n" , s)                             ;
        printf("oct : %s\n" , bin2oct(s , t))                ;
        printf("dec : %d\n" , fromoct(t))                    ;
        printf("hex : %s\n" , oct2hex(t , s))                ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 10:54:27 | 显示全部楼层
风过无痕1989 发表于 2020-12-22 19:22
我晕,我选了一个最不好做的题目

擦,记得我们刚学一个月C的时候,这就是我们的作业
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-12-23 13:07:38 | 显示全部楼层
一世轻尘 发表于 2020-12-23 10:54
擦,记得我们刚学一个月C的时候,这就是我们的作业

十进制转二进制,二进制转十进制不难,二进制转八进制,手动转很容易,程序转,绕得头晕,差不多花了两个小时,准备再发过来时,发现已经有人回答了,我也就不好意思再发过来了。

现在既然被你选为最佳答案,我还是发过来,补全这道题目吧

谢谢了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 13:41:04 | 显示全部楼层
风过无痕1989 发表于 2020-12-23 13:07
十进制转二进制,二进制转十进制不难,二进制转八进制,手动转很容易,程序转,绕得头晕,差不多花了两个 ...

这是之前的作业,我已经做一遍了,就是感觉有点绕,想看看别人的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 09:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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