一世轻尘 发表于 2020-12-22 18:53:50

题目2 进制转换

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

求助2{:10_332:}

风过无痕1989 发表于 2020-12-22 19:22:40

本帖最后由 风过无痕1989 于 2020-12-23 13:17 编辑

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

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

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

        while ((num / 2) != 1)         // 判断条件为:除以2之后的商不等于1
        {
                binary_num = num % 2;// 取余后的数字存入数组
                num /= 2;                     // num = num/2; 进行下一轮的判断
                count++;                      // 此变量用来指定数组下标
        }
        binary_num = 1;      // 最后一次除法做完以后,剩下的商一定是1,所以在最后手动添加一个1
       
        printf("二进制数值为:");
        for (i = count; i >= 0; i--)
        {
                binaryNum = binary_num + '0';
                printf("%c", binaryNum);
        }
        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;               // 对于支持C99的编译器,元素个数用n
        while ((ch = getchar()) != '\n')      // 输入二进制数
        {
                binaryNum = ch;
                i++;
        }
        n = i;
       
        // 二进制转十进制
        for(i = 0;i < 20;i++)
        {
                if(binaryNum != '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;         // 对于支持C99的编译器,元素个数用n
        char binary_Num;            // 存放反序的二进制数
        char Num8;                  // 存放八进制数
        char Num16;                   // 存放十六进制数
        while ((ch = getchar()) != '\n')// 输入二进制数
        {
                binaryNum = ch;
                i++;
        }
        n = i;
        printf("输入的二进制数为:");
        for (i = 0;i < n;i++)
        {
                if (i % 4 != 0)
                {
                        printf("%c", binaryNum);
                }
                else
                {
                        printf(" ");
                        printf("%c", binaryNum);
                }
        }
        printf("\n");

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

        // 二进制转八进制
        k = 0;
        for (i = 0;i < n;i += 3)
        {
                for(j = 0;j < 3;j++)
                {
                  m = binary_Num - '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 = ch;
                num = 0;
                k++;
        }
        Num8 = '\n';

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

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

        // 二进制转十六进制
        k = 0;
        for (i = 0;i < n;i += 4)
        {
                for (j = 0;j < 4;j++)
                {
                        m = binary_Num - '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 = ch;
                num = 0;
                k++;
        }
        Num16 = '\n';

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

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

jackz007 发表于 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 ++)    ;
      for(i = 0 ; i < m / 2 ; i ++) {
                c = s    ;
                s = s ;
                s = c            ;
      }
}

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

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

// 十六进制字符串转换为整型数
int fromhex(char s[])
{
      int i , m, r                                       ;
      char c                                             ;
      for(m = 0 ; s ; m ++)                           ;
      for(r = i = 0 ; i < m ; i ++) {
                c = s                                     ;
                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 = (d % 2) + '0';
      s = '\0'                                          ;
      reverse(s)                                           ;
      return s                                             ;
}

//整型数转换为八进制字符串
char * tooct(char s[] , int d)
{
      int i , m                                          ;
      for(i = 0 ; d ; d /= 8 , i ++) s = (d % 8) + '0';
      s = '\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 = c - 10 + 'a'                ;
                else s = c + '0'                        ;
      }
      s = '\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 , t                                 ;
      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))                ;
}

一世轻尘 发表于 2020-12-23 10:54:27

风过无痕1989 发表于 2020-12-22 19:22
我晕,我选了一个最不好做的题目

擦,记得我们刚学一个月C的时候,这就是我们的作业{:10_266:}

风过无痕1989 发表于 2020-12-23 13:07:38

一世轻尘 发表于 2020-12-23 10:54
擦,记得我们刚学一个月C的时候,这就是我们的作业

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

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

谢谢了!

一世轻尘 发表于 2020-12-23 13:41:04

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

这是之前的作业,我已经做一遍了,就是感觉有点绕,想看看别人的。{:10_264:}
页: [1]
查看完整版本: 题目2 进制转换