二进制转十六进制
大佬们帮帮我吧~非常感谢了!我看了半天也不知道错在哪里{: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;
}
字符串长度至少是1,至多是10000。
这个要求有问题,对于 64 位系统,能处理整型数的极限只有 64 个二进制位,也就是说,字符串的极限长度是断不可超过 64 的,你这个 10000 到底是 5 个字符还是 10000 个字符,如果你们 teacher 坚持说字符串长度是 10000,那你就可以要求他亲自写出这个程序好让大家也开一下眼。 jackz007 发表于 2022-4-22 16:56
这个要求有问题,对于 64 位系统,能处理整型数的极限只有 64 个二进制位,也就是说,字符串的极 ...
10000应该是10000个字符。噢噢,我知道我哪里错了,sum放不了那么大的数! jackz007 发表于 2022-4-22 16:56
这个要求有问题,对于 64 位系统,能处理整型数的极限只有 64 个二进制位,也就是说,字符串的极 ...
你好,有点没看懂想问一下,你说的字符串极限长度不能超过64是指64位吗?按一字符占1字节转换,字符串最多只能有8个字符的意思? 本帖最后由 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") ;
} jackz007 发表于 2022-4-22 17:28
是的,你从键盘输入的是字符串形式的二进制数,这个字符串的长度绝对不可以超过 64 个字符!
...
what?怎么又不能超过64字符了?不是说8字符吗? jackz007 发表于 2022-4-22 17:28
是的,你从键盘输入的是字符串形式的二进制数,这个字符串的长度绝对不可以超过 64 个字符!
...
你好,我不知道我们理解的是不是一个意思。字符串形式的二进制数应该是字符串吧……如果我们的题目对你造成了误解的话,非常抱歉……
题目的意思应该是读入一个字符串,这个字符串的内容是小于100000位的二进制数……
我刚刚试了试,我可以从键盘读入长度大于64位的字符串…… 风车呼呼呼 发表于 2022-4-22 17:38
what?怎么又不能超过64字符了?不是说8字符吗?
从键盘输入的二进制数 '101' 是 3 个字符,它是二进制数 101,很显然,它有 3 个二进制位。明白? jackz007 发表于 2022-4-22 17:43
从键盘输入的二进制数 '101' 是 3 个字符,它是二进制数 101,很显然,它有 3 个二进制位。明白?
既然说的是字符而不是整型int,那么字符串'101'就是三个字符,每个字符占内存空间1字节,1字节=8比特位,字符串'101'就占24比特位。当然,如果算上'\0'的话就是4个字节,32比特位。请问你说的二进制位是什么位? SR83694402 发表于 2022-4-22 17:39
你好,我不知道我们理解的是不是一个意思。字符串形式的二进制数应该是字符串吧……如果我们的题目对你造 ...
我用 C 语言写程序的时间超过 30 年,不瞒你说,对于超过 64 位的整型数,靠我自己的实力根本就无法掌控,你应该是初学 C 语言吧,我不相信你会遇到这样要求的题目! jackz007 发表于 2022-4-22 17:50
我用 C 语言写程序的时间超过 30 年,不瞒你说,对于超过 64 位的整型数,靠我自己的实力根本就 ...
啊大佬大佬!别说64位的整型了,我连超过long long范围的整型都处理不了……
我之前遇到过一个比较复杂的题目,是用字符型数组模拟加减乘除
我的这个题目应该是……换一种思路吧,,一次处理四位二进制数,直接转换成十六进制数,处理输出 SR83694402 发表于 2022-4-22 17:58
啊大佬大佬!别说64位的整型了,我连超过long long范围的整型都处理不了……
我之前遇到过一个比较复杂 ...
你可以试试提交我写的代码,看看 PTA 的回应是什么。 jackz007 发表于 2022-4-22 18:03
你可以试试提交我写的代码,看看 PTA 的回应是什么。
也是答案错误。我感觉这是老师故意设计的,想考我们其他的知识 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") ;
} jackz007 发表于 2022-4-22 22:03
多谢你的信任,我终于想到办法了,你在 PTA 上再试试这个代码:
通过了!大佬!大佬!非常感谢!!!
页:
[1]