鱼C论坛

 找回密码
 立即注册
查看: 2425|回复: 14

[已解决]二进制转十六进制

[复制链接]
发表于 2022-4-22 16:24:05 | 显示全部楼层 |阅读模式

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

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

x
大佬们帮帮我吧~非常感谢了!我看了半天也不知道错在哪里(学校的作业)在本地可以通过,但是在PTA里不可以通过,报答案错误

输入一个2进制的数,要求输出该2进制数的16进制表示。在16进制的表示中,A-F表示10-15。
输入格式:
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个以0和1组成的字符串,字符串长度至少是1,至多是10000。
输出格式:
n行,每行输出对应一个输入。

  1. #include <stdio.h>
  2. #include <string.h>
  3. char b[100005],x[25001];
  4. int main()
  5. {
  6.         int count,sum,len,i;
  7.         scanf("%d",&count);
  8.         while (count--){
  9.                 scanf("%s",b);
  10.                 sum=0;
  11.                 len=strlen(b);
  12.                 for (i=0;i<len-1;i++){
  13.                         sum+=b[i]-'0';
  14.                         sum*=2;
  15.                 }
  16.                 sum+=b[i]-'0';
  17.                 len=0;
  18.                 if (sum==0) {
  19.                         printf("0\n");
  20.                         continue;
  21.                 }
  22.                 while (sum){
  23.                         if (sum%16<10) {
  24.                                 x[len++]=sum%16+'0';
  25.                         }
  26.                         else {
  27.                                 x[len++]=sum%16-10+'A';
  28.                         }
  29.                         sum=sum/16;
  30.                 }
  31.                 for (len=len-1;len>=0;len--){
  32.                         printf("%c",x[len]);
  33.                 }
  34.                 printf("\n");
  35.         }
  36.         return 0;
  37. }
复制代码





最佳答案
2022-4-22 17:28:14
本帖最后由 jackz007 于 2022-4-22 17:32 编辑
风车呼呼呼 发表于 2022-4-22 17:25
你好,有点没看懂想问一下,你说的字符串极限长度不能超过64是指64位吗?按一字符占1字节转换,字符串最 ...


         是的,你从键盘输入的是字符串形式的二进制数,这个字符串的长度绝对不可以超过 64 个字符!
  1. #include <stdio.h>

  2. char * bin2hex(char h[] , char b[])
  3. {
  4.         char c                                                          ;
  5.         unsigned long long d , e , i , k                                ;
  6.         for(d = i = 0 ; b[i] ; i ++) d = d * 2 + b[i] - '0'             ;
  7.         for(e = d , k = 0 ; e ; k ++) e /= 16                           ;
  8.         h[k --] = '\0'                                                  ;
  9.         for(; d ; k -- , d /= 16) {
  10.                 c = d % 16                                              ;
  11.                 if(c > 9) h[k] = 'A' + c - 10                           ;
  12.                 else h[k] = '0' + c                                     ;
  13.         }
  14.         return h                                                        ;
  15. }

  16. int main(void)
  17. {
  18.         char b[1000][68] , h[1000][20]                                  ;
  19.         int i , n                                                       ;
  20.         scanf("%d" , & n)                                               ;
  21.         for(i = 0 ; i < n ; i ++) scanf("%s" , b[i])                    ;
  22.         for(i = 0 ; i < n ; i ++) printf("%s\n" , bin2hex(h[i] , b[i])) ;
  23.         printf("\n")                                                    ;
  24. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-4-22 16:56:43 | 显示全部楼层
  1. 字符串长度至少是1,至多是10000。
复制代码

        这个要求有问题,对于 64 位系统,能处理整型数的极限只有 64 个二进制位,也就是说,字符串的极限长度是断不可超过 64 的,你这个 10000 到底是 5 个字符还是 10000 个字符,如果你们 teacher 坚持说字符串长度是 10000,那你就可以要求他亲自写出这个程序好让大家也开一下眼。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-22 17:21:09 | 显示全部楼层
jackz007 发表于 2022-4-22 16:56
这个要求有问题,对于 64 位系统,能处理整型数的极限只有 64 个二进制位,也就是说,字符串的极 ...

10000应该是10000个字符。噢噢,我知道我哪里错了,sum放不了那么大的数!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-22 17:25:24 | 显示全部楼层
jackz007 发表于 2022-4-22 16:56
这个要求有问题,对于 64 位系统,能处理整型数的极限只有 64 个二进制位,也就是说,字符串的极 ...

你好,有点没看懂想问一下,你说的字符串极限长度不能超过64是指64位吗?按一字符占1字节转换,字符串最多只能有8个字符的意思?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-22 17:28:14 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-4-22 17:32 编辑
风车呼呼呼 发表于 2022-4-22 17:25
你好,有点没看懂想问一下,你说的字符串极限长度不能超过64是指64位吗?按一字符占1字节转换,字符串最 ...


         是的,你从键盘输入的是字符串形式的二进制数,这个字符串的长度绝对不可以超过 64 个字符!
  1. #include <stdio.h>

  2. char * bin2hex(char h[] , char b[])
  3. {
  4.         char c                                                          ;
  5.         unsigned long long d , e , i , k                                ;
  6.         for(d = i = 0 ; b[i] ; i ++) d = d * 2 + b[i] - '0'             ;
  7.         for(e = d , k = 0 ; e ; k ++) e /= 16                           ;
  8.         h[k --] = '\0'                                                  ;
  9.         for(; d ; k -- , d /= 16) {
  10.                 c = d % 16                                              ;
  11.                 if(c > 9) h[k] = 'A' + c - 10                           ;
  12.                 else h[k] = '0' + c                                     ;
  13.         }
  14.         return h                                                        ;
  15. }

  16. int main(void)
  17. {
  18.         char b[1000][68] , h[1000][20]                                  ;
  19.         int i , n                                                       ;
  20.         scanf("%d" , & n)                                               ;
  21.         for(i = 0 ; i < n ; i ++) scanf("%s" , b[i])                    ;
  22.         for(i = 0 ; i < n ; i ++) printf("%s\n" , bin2hex(h[i] , b[i])) ;
  23.         printf("\n")                                                    ;
  24. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-22 17:38:45 | 显示全部楼层
jackz007 发表于 2022-4-22 17:28
是的,你从键盘输入的是字符串形式的二进制数,这个字符串的长度绝对不可以超过 64 个字符!
...

what?怎么又不能超过64字符了?不是说8字符吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-22 17:39:34 | 显示全部楼层
jackz007 发表于 2022-4-22 17:28
是的,你从键盘输入的是字符串形式的二进制数,这个字符串的长度绝对不可以超过 64 个字符!
...

你好,我不知道我们理解的是不是一个意思。字符串形式的二进制数应该是字符串吧……如果我们的题目对你造成了误解的话,非常抱歉……
题目的意思应该是读入一个字符串,这个字符串的内容是小于100000位的二进制数……
我刚刚试了试,我可以从键盘读入长度大于64位的字符串……
QQ截图20220422173526.png
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-22 17:43:05 | 显示全部楼层
风车呼呼呼 发表于 2022-4-22 17:38
what?怎么又不能超过64字符了?不是说8字符吗?

      从键盘输入的二进制数 '101' 是 3 个字符,它是二进制数 101,很显然,它有 3 个二进制位。明白?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-22 17:48:53 | 显示全部楼层
jackz007 发表于 2022-4-22 17:43
从键盘输入的二进制数 '101' 是 3 个字符,它是二进制数 101,很显然,它有 3 个二进制位。明白?

既然说的是字符而不是整型int,那么字符串'101'就是三个字符,每个字符占内存空间1字节,1字节=8比特位,字符串'101'就占24比特位。当然,如果算上'\0'的话就是4个字节,32比特位。请问你说的二进制位是什么位?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-22 17:50:42 | 显示全部楼层
SR83694402 发表于 2022-4-22 17:39
你好,我不知道我们理解的是不是一个意思。字符串形式的二进制数应该是字符串吧……如果我们的题目对你造 ...

        我用 C 语言写程序的时间超过 30 年,不瞒你说,对于超过 64 位的整型数,靠我自己的实力根本就无法掌控,你应该是初学 C 语言吧,我不相信你会遇到这样要求的题目!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-22 17:58:11 | 显示全部楼层
jackz007 发表于 2022-4-22 17:50
我用 C 语言写程序的时间超过 30 年,不瞒你说,对于超过 64 位的整型数,靠我自己的实力根本就 ...

啊大佬大佬!别说64位的整型了,我连超过long long范围的整型都处理不了……
我之前遇到过一个比较复杂的题目,是用字符型数组模拟加减乘除
我的这个题目应该是……换一种思路吧,,一次处理四位二进制数,直接转换成十六进制数,处理输出
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-22 18:03:05 | 显示全部楼层
SR83694402 发表于 2022-4-22 17:58
啊大佬大佬!别说64位的整型了,我连超过long long范围的整型都处理不了……
我之前遇到过一个比较复杂 ...

       你可以试试提交我写的代码,看看 PTA 的回应是什么。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-22 18:12:58 | 显示全部楼层
jackz007 发表于 2022-4-22 18:03
你可以试试提交我写的代码,看看 PTA 的回应是什么。

也是答案错误。我感觉这是老师故意设计的,想考我们其他的知识
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-22 22:03:47 | 显示全部楼层
SR83694402 发表于 2022-4-22 18:12
也是答案错误。我感觉这是老师故意设计的,想考我们其他的知识

          多谢你的信任,我终于想到办法了,你在 PTA 上再试试这个代码:
  1. #include <stdio.h>

  2. char * bin2hex(char h[] , char b[])
  3. {
  4.         char x[16]                                                      ;
  5.         int d , i , j , n                                               ;
  6.         for(i = 0 ; i < 16 ; i ++) {
  7.                 if(i < 10) x[i] = '0' + i                               ;
  8.                 else x[i] = 'A' + i - 10                                ;
  9.         }
  10.         for(n = 0 ; b[n] ; n ++)                                        ;
  11.         for(d = i = j = 0 ; i < n ; i ++) {
  12.                 d = d * 2 + b[i] - '0'                                  ;
  13.                 if(! ((n - i - 1) % 4)) {
  14.                         h[j ++] = x[d]                                  ;
  15.                         h[j] = '\0'                                     ;
  16.                         d = 0                                           ;
  17.                 }
  18.         }
  19.         return h                                                        ;
  20. }

  21. int main(void)
  22. {
  23.         char b[100][10004] , c , h[100][2504]                           ;
  24.         int i , j , n                                                   ;
  25.         scanf("%d" , & n)                                               ;
  26.         for(i = 0 ; i < n ; i ++) {
  27.                 fflush(stdin)                                           ;
  28.                 for(j = 0 ; (c = getchar()) != '\n' && j < 10000 ; j ++) {
  29.                         b[i][j] = c                                     ;
  30.                         b[i][j + 1] = '\0'                              ;
  31.                 }
  32.         }
  33.         for(i = 0 ; i < n ; i ++) printf("%s\n" , bin2hex(h[i] , b[i])) ;
  34.         printf("\n")                                                    ;
  35. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-23 10:00:59 | 显示全部楼层
jackz007 发表于 2022-4-22 22:03
多谢你的信任,我终于想到办法了,你在 PTA 上再试试这个代码:

通过了!大佬!大佬!非常感谢!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-24 18:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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