SR83694402 发表于 2022-4-22 16:24:05

二进制转十六进制

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

输入一个2进制的数,要求输出该2进制数的16进制表示。在16进制的表示中,A-F表示10-15。输入格式:第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个以0和1组成的字符串,字符串长度至少是1,至多是10000。输出格式:n行,每行输出对应一个输入。
#include <stdio.h>
#include <string.h>
char b,x;
int main()
{
        int count,sum,len,i;
        scanf("%d",&count);
        while (count--){
                scanf("%s",b);
                sum=0;
                len=strlen(b);
                for (i=0;i<len-1;i++){
                        sum+=b-'0';
                        sum*=2;
                }
                sum+=b-'0';
                len=0;
                if (sum==0) {
                        printf("0\n");
                        continue;
                }
                while (sum){
                        if (sum%16<10) {
                                x=sum%16+'0';
                        }
                        else {
                                x=sum%16-10+'A';
                        }
                        sum=sum/16;
                }
                for (len=len-1;len>=0;len--){
                        printf("%c",x);
                }
                printf("\n");
        }
        return 0;
}




jackz007 发表于 2022-4-22 16:56:43

字符串长度至少是1,至多是10000。
      这个要求有问题,对于 64 位系统,能处理整型数的极限只有 64 个二进制位,也就是说,字符串的极限长度是断不可超过 64 的,你这个 10000 到底是 5 个字符还是 10000 个字符,如果你们 teacher 坚持说字符串长度是 10000,那你就可以要求他亲自写出这个程序好让大家也开一下眼。

SR83694402 发表于 2022-4-22 17:21:09

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

10000应该是10000个字符。噢噢,我知道我哪里错了,sum放不了那么大的数!

风车呼呼呼 发表于 2022-4-22 17:25:24

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

你好,有点没看懂想问一下,你说的字符串极限长度不能超过64是指64位吗?按一字符占1字节转换,字符串最多只能有8个字符的意思?

jackz007 发表于 2022-4-22 17:28:14

本帖最后由 jackz007 于 2022-4-22 17:32 编辑

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

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

char * bin2hex(char h[] , char b[])
{
      char c                                                          ;
      unsigned long long d , e , i , k                              ;
      for(d = i = 0 ; b ; i ++) d = d * 2 + b - '0'             ;
      for(e = d , k = 0 ; e ; k ++) e /= 16                           ;
      h = '\0'                                                ;
      for(; d ; k -- , d /= 16) {
                c = d % 16                                              ;
                if(c > 9) h = 'A' + c - 10                           ;
                else h = '0' + c                                     ;
      }
      return h                                                      ;
}

int main(void)
{
      char b , h                                  ;
      int i , n                                                       ;
      scanf("%d" , & n)                                             ;
      for(i = 0 ; i < n ; i ++) scanf("%s" , b)                  ;
      for(i = 0 ; i < n ; i ++) printf("%s\n" , bin2hex(h , b)) ;
      printf("\n")                                                    ;
}

风车呼呼呼 发表于 2022-4-22 17:38:45

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

what?怎么又不能超过64字符了?不是说8字符吗?

SR83694402 发表于 2022-4-22 17:39:34

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

你好,我不知道我们理解的是不是一个意思。字符串形式的二进制数应该是字符串吧……如果我们的题目对你造成了误解的话,非常抱歉……
题目的意思应该是读入一个字符串,这个字符串的内容是小于100000位的二进制数……
我刚刚试了试,我可以从键盘读入长度大于64位的字符串……

jackz007 发表于 2022-4-22 17:43:05

风车呼呼呼 发表于 2022-4-22 17:38
what?怎么又不能超过64字符了?不是说8字符吗?

      从键盘输入的二进制数 '101' 是 3 个字符,它是二进制数 101,很显然,它有 3 个二进制位。明白?

风车呼呼呼 发表于 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比特位。请问你说的二进制位是什么位?

jackz007 发表于 2022-4-22 17:50:42

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

      我用 C 语言写程序的时间超过 30 年,不瞒你说,对于超过 64 位的整型数,靠我自己的实力根本就无法掌控,你应该是初学 C 语言吧,我不相信你会遇到这样要求的题目!

SR83694402 发表于 2022-4-22 17:58:11

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

啊大佬大佬!别说64位的整型了,我连超过long long范围的整型都处理不了……
我之前遇到过一个比较复杂的题目,是用字符型数组模拟加减乘除
我的这个题目应该是……换一种思路吧,,一次处理四位二进制数,直接转换成十六进制数,处理输出

jackz007 发表于 2022-4-22 18:03:05

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

       你可以试试提交我写的代码,看看 PTA 的回应是什么。

SR83694402 发表于 2022-4-22 18:12:58

jackz007 发表于 2022-4-22 18:03
你可以试试提交我写的代码,看看 PTA 的回应是什么。

也是答案错误。我感觉这是老师故意设计的,想考我们其他的知识

jackz007 发表于 2022-4-22 22:03:47

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

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

char * bin2hex(char h[] , char b[])
{
      char x                                                      ;
      int d , i , j , n                                             ;
      for(i = 0 ; i < 16 ; i ++) {
                if(i < 10) x = '0' + i                               ;
                else x = 'A' + i - 10                              ;
      }
      for(n = 0 ; b ; n ++)                                        ;
      for(d = i = j = 0 ; i < n ; i ++) {
                d = d * 2 + b - '0'                                  ;
                if(! ((n - i - 1) % 4)) {
                        h = x                                  ;
                        h = '\0'                                     ;
                        d = 0                                           ;
                }
      }
      return h                                                      ;
}

int main(void)
{
      char b , c , h                           ;
      int i , j , n                                                   ;
      scanf("%d" , & n)                                             ;
      for(i = 0 ; i < n ; i ++) {
                fflush(stdin)                                           ;
                for(j = 0 ; (c = getchar()) != '\n' && j < 10000 ; j ++) {
                        b = c                                     ;
                        b = '\0'                              ;
                }
      }
      for(i = 0 ; i < n ; i ++) printf("%s\n" , bin2hex(h , b)) ;
      printf("\n")                                                    ;
}

SR83694402 发表于 2022-4-23 10:00:59

jackz007 发表于 2022-4-22 22:03
多谢你的信任,我终于想到办法了,你在 PTA 上再试试这个代码:

通过了!大佬!大佬!非常感谢!!!
页: [1]
查看完整版本: 二进制转十六进制