鱼C论坛

 找回密码
 立即注册
查看: 2058|回复: 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行,每行输出对应一个输入。
#include <stdio.h>
#include <string.h>
char b[100005],x[25001];
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[i]-'0';
                        sum*=2;
                }
                sum+=b[i]-'0';
                len=0;
                if (sum==0) {
                        printf("0\n");
                        continue;
                }
                while (sum){
                        if (sum%16<10) {
                                x[len++]=sum%16+'0';
                        }
                        else {
                                x[len++]=sum%16-10+'A';
                        }
                        sum=sum/16;
                }
                for (len=len-1;len>=0;len--){
                        printf("%c",x[len]);
                }
                printf("\n");
        }
        return 0;
}




最佳答案
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] ; i ++) d = d * 2 + b[i] - '0'             ;
        for(e = d , k = 0 ; e ; k ++) e /= 16                           ;
        h[k --] = '\0'                                                  ;
        for(; d ; k -- , d /= 16) {
                c = d % 16                                              ;
                if(c > 9) h[k] = 'A' + c - 10                           ;
                else h[k] = '0' + c                                     ;
        }
        return h                                                        ;
}

int main(void)
{
        char b[1000][68] , h[1000][20]                                  ;
        int i , n                                                       ;
        scanf("%d" , & n)                                               ;
        for(i = 0 ; i < n ; i ++) scanf("%s" , b[i])                    ;
        for(i = 0 ; i < n ; i ++) printf("%s\n" , bin2hex(h[i] , b[i])) ;
        printf("\n")                                                    ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-22 16:56:43 | 显示全部楼层
字符串长度至少是1,至多是10000。
        这个要求有问题,对于 64 位系统,能处理整型数的极限只有 64 个二进制位,也就是说,字符串的极限长度是断不可超过 64 的,你这个 10000 到底是 5 个字符还是 10000 个字符,如果你们 teacher 坚持说字符串长度是 10000,那你就可以要求他亲自写出这个程序好让大家也开一下眼。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

10000应该是10000个字符。噢噢,我知道我哪里错了,sum放不了那么大的数!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

发表于 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] ; i ++) d = d * 2 + b[i] - '0'             ;
        for(e = d , k = 0 ; e ; k ++) e /= 16                           ;
        h[k --] = '\0'                                                  ;
        for(; d ; k -- , d /= 16) {
                c = d % 16                                              ;
                if(c > 9) h[k] = 'A' + c - 10                           ;
                else h[k] = '0' + c                                     ;
        }
        return h                                                        ;
}

int main(void)
{
        char b[1000][68] , h[1000][20]                                  ;
        int i , n                                                       ;
        scanf("%d" , & n)                                               ;
        for(i = 0 ; i < n ; i ++) scanf("%s" , b[i])                    ;
        for(i = 0 ; i < n ; i ++) printf("%s\n" , bin2hex(h[i] , b[i])) ;
        printf("\n")                                                    ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

what?怎么又不能超过64字符了?不是说8字符吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

      从键盘输入的二进制数 '101' 是 3 个字符,它是二进制数 101,很显然,它有 3 个二进制位。明白?
想知道小甲鱼最近在做啥?请访问 -> 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比特位。请问你说的二进制位是什么位?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

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

       你可以试试提交我写的代码,看看 PTA 的回应是什么。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

也是答案错误。我感觉这是老师故意设计的,想考我们其他的知识
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

int main(void)
{
        char b[100][10004] , c , h[100][2504]                           ;
        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[i][j] = c                                     ;
                        b[i][j + 1] = '\0'                              ;
                }
        }
        for(i = 0 ; i < n ; i ++) printf("%s\n" , bin2hex(h[i] , b[i])) ;
        printf("\n")                                                    ;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-5 20:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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