鱼C论坛

 找回密码
 立即注册
查看: 1247|回复: 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 编辑

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

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

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

  11.         while ((num / 2) != 1)           // 判断条件为:除以2之后的商不等于1
  12.         {
  13.                 binary_num[count] = num % 2;  // 取余后的数字存入数组
  14.                 num /= 2;                     // num = num/2; 进行下一轮的判断
  15.                 count++;                      // 此变量用来指定数组下标
  16.         }
  17.         binary_num[count + 1] = 1;        // 最后一次除法做完以后,剩下的商一定是1,所以在最后手动添加一个1
  18.        
  19.         printf("二进制数值为:");
  20.         for (i = count; i >= 0; i--)
  21.         {
  22.                 binaryNum[i] = binary_num[i] + '0';
  23.                 printf("%c", binaryNum[i]);
  24.         }
  25.         printf("\n");
  26. }
复制代码

  1. // 二进制数转换为十进制数
  2. #include<stdio.h>
  3. #include<math.h>
  4. int main()
  5. {
  6.         int i = 0, j, k, l, m, n, num = 0;
  7.         double sum = 0;
  8.         printf("请输入二进制数的位数:");
  9.         scanf("%d", &n);
  10.         char ch, binaryNum[21];                 // 对于支持C99的编译器,元素个数用n
  11.         while ((ch = getchar()) != '\n')        // 输入二进制数
  12.         {
  13.                 binaryNum[i] = ch;
  14.                 i++;
  15.         }
  16.         n = i;
  17.        
  18.         // 二进制转十进制
  19.         for(i = 0;i < 20;i++)
  20.         {
  21.                 if(binaryNum[i] != '0')
  22.                 sum += pow(2,(20 - i - 1));
  23.         }
  24.         printf("转换成十进制数为:");
  25.         printf("%lf\n", sum);
  26.        
  27. }
复制代码

  1. // 二进制数转换成八进制数、十六进制数
  2. #include<stdio.h>
  3. #include<math.h>
  4. int main()
  5. {
  6.         int i = 0, j, k, m, n = 20, num = 0;
  7.         double sum = 0;
  8.         printf("请输入二进制数的位数:");
  9.         scanf("%d", &n);
  10.         getchar();
  11.         char ch, binaryNum[21];           // 对于支持C99的编译器,元素个数用n
  12.         char binary_Num[21];              // 存放反序的二进制数
  13.         char Num8[21];                    // 存放八进制数
  14.         char Num16[21];                   // 存放十六进制数
  15.         while ((ch = getchar()) != '\n')  // 输入二进制数
  16.         {
  17.                 binaryNum[i] = ch;
  18.                 i++;
  19.         }
  20.         n = i;
  21.         printf("输入的二进制数为:");
  22.         for (i = 0;i < n;i++)
  23.         {
  24.                 if (i % 4 != 0)
  25.                 {
  26.                         printf("%c", binaryNum[i]);
  27.                 }
  28.                 else
  29.                 {
  30.                         printf(" ");
  31.                         printf("%c", binaryNum[i]);
  32.                 }
  33.         }
  34.         printf("\n");

  35.         // 二进制数组反序
  36.         i = 0;
  37.         while ((n - i) > 0)
  38.         {
  39.                 binary_Num[i] = binaryNum[n - i - 1];
  40.                 i++;
  41.         }
  42.         binary_Num[n] = '\0';

  43.         // 二进制转八进制
  44.         k = 0;
  45.         for (i = 0;i < n;i += 3)
  46.         {
  47.                 for(j = 0;j < 3;j++)
  48.                 {
  49.                     m = binary_Num[i + j] - '0';      // 将字符转换为数字
  50.                     if (j == 0 && (m == 0 || m == 1)) // 多加的m条件是防止结束符参与计算
  51.                             num = m * 1;
  52.                     if (j == 1 && (m == 0 || m == 1))
  53.                             num += m * 2;
  54.                     if (j == 2 && (m == 0 || m == 1))
  55.                             num += m * 4;
  56.                 }
  57.                 ch = num + '0';                     // 将数字转换为字符
  58.                 Num8[k] = ch;
  59.                 num = 0;
  60.                 k++;
  61.         }
  62.         Num8[k] = '\n';

  63.         i = 0;                                  // 将反序的8进制数再反序回来
  64.         while ((k - i) > k / 2)
  65.         {
  66.                 ch = Num8[i];
  67.                 Num8[i] = Num8[k - i - 1];
  68.                 Num8[k - i - 1] = ch;
  69.                 i++;
  70.         }

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

  75.         // 二进制转十六进制
  76.         k = 0;
  77.         for (i = 0;i < n;i += 4)
  78.         {
  79.                 for (j = 0;j < 4;j++)
  80.                 {
  81.                         m = binary_Num[i + j] - '0';      // 将字符转换为数字
  82.                         if (j == 0 && (m == 0 || m == 1)) // 多加的m条件是防止结束符参与计算
  83.                                 num = m * 1;
  84.                         if (j == 1 && (m == 0 || m == 1))
  85.                                 num += m * 2;
  86.                         if (j == 2 && (m == 0 || m == 1))
  87.                                 num += m * 4;
  88.                         if (j == 3 && (m == 0 || m == 1))
  89.                                 num += m * 8;
  90.                 }
  91.                 if (num >= 10 && num <= 16)           // 将数字转换为字符
  92.                         ch = (num - 10) + 'A';
  93.                 else
  94.                     ch = num + '0';
  95.                 Num16[k] = ch;
  96.                 num = 0;
  97.                 k++;
  98.         }
  99.         Num16[k] = '\n';

  100.         i = 0;                                  // 将反序的16进制数再反序回来
  101.         while ((k - i) > k / 2)
  102.         {
  103.                 ch = Num16[i];
  104.                 Num16[i] = Num16[k - i - 1];
  105.                 Num16[k - i - 1] = ch;
  106.                 i++;
  107.         }

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

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

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

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

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

  11.         while ((num / 2) != 1)           // 判断条件为:除以2之后的商不等于1
  12.         {
  13.                 binary_num[count] = num % 2;  // 取余后的数字存入数组
  14.                 num /= 2;                     // num = num/2; 进行下一轮的判断
  15.                 count++;                      // 此变量用来指定数组下标
  16.         }
  17.         binary_num[count + 1] = 1;        // 最后一次除法做完以后,剩下的商一定是1,所以在最后手动添加一个1
  18.        
  19.         printf("二进制数值为:");
  20.         for (i = count; i >= 0; i--)
  21.         {
  22.                 binaryNum[i] = binary_num[i] + '0';
  23.                 printf("%c", binaryNum[i]);
  24.         }
  25.         printf("\n");
  26. }
复制代码

  1. // 二进制数转换为十进制数
  2. #include<stdio.h>
  3. #include<math.h>
  4. int main()
  5. {
  6.         int i = 0, j, k, l, m, n, num = 0;
  7.         double sum = 0;
  8.         printf("请输入二进制数的位数:");
  9.         scanf("%d", &n);
  10.         char ch, binaryNum[21];                 // 对于支持C99的编译器,元素个数用n
  11.         while ((ch = getchar()) != '\n')        // 输入二进制数
  12.         {
  13.                 binaryNum[i] = ch;
  14.                 i++;
  15.         }
  16.         n = i;
  17.        
  18.         // 二进制转十进制
  19.         for(i = 0;i < 20;i++)
  20.         {
  21.                 if(binaryNum[i] != '0')
  22.                 sum += pow(2,(20 - i - 1));
  23.         }
  24.         printf("转换成十进制数为:");
  25.         printf("%lf\n", sum);
  26.        
  27. }
复制代码

  1. // 二进制数转换成八进制数、十六进制数
  2. #include<stdio.h>
  3. #include<math.h>
  4. int main()
  5. {
  6.         int i = 0, j, k, m, n = 20, num = 0;
  7.         double sum = 0;
  8.         printf("请输入二进制数的位数:");
  9.         scanf("%d", &n);
  10.         getchar();
  11.         char ch, binaryNum[21];           // 对于支持C99的编译器,元素个数用n
  12.         char binary_Num[21];              // 存放反序的二进制数
  13.         char Num8[21];                    // 存放八进制数
  14.         char Num16[21];                   // 存放十六进制数
  15.         while ((ch = getchar()) != '\n')  // 输入二进制数
  16.         {
  17.                 binaryNum[i] = ch;
  18.                 i++;
  19.         }
  20.         n = i;
  21.         printf("输入的二进制数为:");
  22.         for (i = 0;i < n;i++)
  23.         {
  24.                 if (i % 4 != 0)
  25.                 {
  26.                         printf("%c", binaryNum[i]);
  27.                 }
  28.                 else
  29.                 {
  30.                         printf(" ");
  31.                         printf("%c", binaryNum[i]);
  32.                 }
  33.         }
  34.         printf("\n");

  35.         // 二进制数组反序
  36.         i = 0;
  37.         while ((n - i) > 0)
  38.         {
  39.                 binary_Num[i] = binaryNum[n - i - 1];
  40.                 i++;
  41.         }
  42.         binary_Num[n] = '\0';

  43.         // 二进制转八进制
  44.         k = 0;
  45.         for (i = 0;i < n;i += 3)
  46.         {
  47.                 for(j = 0;j < 3;j++)
  48.                 {
  49.                     m = binary_Num[i + j] - '0';      // 将字符转换为数字
  50.                     if (j == 0 && (m == 0 || m == 1)) // 多加的m条件是防止结束符参与计算
  51.                             num = m * 1;
  52.                     if (j == 1 && (m == 0 || m == 1))
  53.                             num += m * 2;
  54.                     if (j == 2 && (m == 0 || m == 1))
  55.                             num += m * 4;
  56.                 }
  57.                 ch = num + '0';                     // 将数字转换为字符
  58.                 Num8[k] = ch;
  59.                 num = 0;
  60.                 k++;
  61.         }
  62.         Num8[k] = '\n';

  63.         i = 0;                                  // 将反序的8进制数再反序回来
  64.         while ((k - i) > k / 2)
  65.         {
  66.                 ch = Num8[i];
  67.                 Num8[i] = Num8[k - i - 1];
  68.                 Num8[k - i - 1] = ch;
  69.                 i++;
  70.         }

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

  75.         // 二进制转十六进制
  76.         k = 0;
  77.         for (i = 0;i < n;i += 4)
  78.         {
  79.                 for (j = 0;j < 4;j++)
  80.                 {
  81.                         m = binary_Num[i + j] - '0';      // 将字符转换为数字
  82.                         if (j == 0 && (m == 0 || m == 1)) // 多加的m条件是防止结束符参与计算
  83.                                 num = m * 1;
  84.                         if (j == 1 && (m == 0 || m == 1))
  85.                                 num += m * 2;
  86.                         if (j == 2 && (m == 0 || m == 1))
  87.                                 num += m * 4;
  88.                         if (j == 3 && (m == 0 || m == 1))
  89.                                 num += m * 8;
  90.                 }
  91.                 if (num >= 10 && num <= 16)           // 将数字转换为字符
  92.                         ch = (num - 10) + 'A';
  93.                 else
  94.                     ch = num + '0';
  95.                 Num16[k] = ch;
  96.                 num = 0;
  97.                 k++;
  98.         }
  99.         Num16[k] = '\n';

  100.         i = 0;                                  // 将反序的16进制数再反序回来
  101.         while ((k - i) > k / 2)
  102.         {
  103.                 ch = Num16[i];
  104.                 Num16[i] = Num16[k - i - 1];
  105.                 Num16[k - i - 1] = ch;
  106.                 i++;
  107.         }

  108.         printf("转换为16进制数为:");
  109.         for (i = 0;i < k;i++)
  110.                 printf("%c", Num16[i]);
  111.         printf("\n");
  112. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

  3. //字符串倒序
  4. void reverse(char s[])
  5. {
  6.         char c                      ;
  7.         int i , m                   ;
  8.         for(m = 0 ; s[m] ; m ++)    ;
  9.         for(i = 0 ; i < m / 2 ; i ++) {
  10.                 c = s[m - 1 - i]    ;
  11.                 s[m - 1 - i] = s[i] ;
  12.                 s[i] = c            ;
  13.         }
  14. }

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

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

  31. // 十六进制字符串转换为整型数
  32. int fromhex(char s[])
  33. {
  34.         int i , m  , r                                       ;
  35.         char c                                               ;
  36.         for(m = 0 ; s[m] ; m ++)                             ;
  37.         for(r = i = 0 ; i < m ; i ++) {
  38.                 c = s[i]                                     ;
  39.                 if(c >= 'A' && c <= 'F') c += ' '            ;
  40.                 if(c > '9') c = 10 + c - 'a'                 ;
  41.                 else c = c - '0'                             ;
  42.                 r = r * 16 + c                               ;
  43.         }
  44.         return r                                             ;
  45. }

  46. //整型数转换为二进制字符串
  47. char * tobin(char s[] , int d)
  48. {
  49.         int i , m                                            ;
  50.         for(i = 0 ; d ; d /= 2 , i ++) s[i] = (d % 2) + '0'  ;
  51.         s[i] = '\0'                                          ;
  52.         reverse(s)                                           ;
  53.         return s                                             ;
  54. }

  55. //整型数转换为八进制字符串
  56. char * tooct(char s[] , int d)
  57. {
  58.         int i , m                                            ;
  59.         for(i = 0 ; d ; d /= 8 , i ++) s[i] = (d % 8) + '0'  ;
  60.         s[i] = '\0'                                          ;
  61.         reverse(s)                                           ;
  62.         return s                                             ;
  63. }

  64. //整型数转换为十六进制字符串
  65. char * tohex(char s[] , int d)
  66. {
  67.         char c                                               ;
  68.         int i , m                                            ;
  69.         for(i = 0 ; d ; d /= 16 , i ++) {
  70.                 c = d % 16                                   ;
  71.                 if(c > 9) s[i] = c - 10 + 'a'                ;
  72.                 else s[i] = c + '0'                          ;
  73.         }
  74.         s[i] = '\0'                                          ;
  75.         reverse(s)                                           ;
  76.         return s                                             ;
  77. }

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

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

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

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

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

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

  114. int main(void)
  115. {
  116.         char s[256] , t[256]                                 ;
  117.         int d                                                ;
  118.         strcpy(s , "10101010")                               ;
  119.         printf("bin : %s\n" , s)                             ;
  120.         printf("oct : %s\n" , bin2oct(s , t))                ;
  121.         printf("dec : %d\n" , fromoct(t))                    ;
  122.         printf("hex : %s\n" , oct2hex(t , s))                ;
  123. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

擦,记得我们刚学一个月C的时候,这就是我们的作业
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

谢谢了!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

这是之前的作业,我已经做一遍了,就是感觉有点绕,想看看别人的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-4 06:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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