第一行为一个整数m,表示测试用列数;接下来有m行,每一行表示一个测试用例,每个测试用例为一个以H结尾的十六进制的整数n。
输出数据
十六进制整数n对应的二进制数在一行输出,多个测试结果顺序输出,之间没有空行,整数前不加无效的0.
输入样例
2
225H
F8H
输出样例
1001010101
11111000
下面是我编写的总是在输出二进制的开头会出现问题
#include<stdio.h>
int main()
{
int a,b,c,d,m,i,j,n,f,g;
printf("请输入一个数m:");
scanf("%d",&m);
for(i=0;i<m;i++)
{
printf("请输入一个16进制数");
scanf("%x",&a);
g=getchar();
b=a;
for(j=0;a!=0;j++)
a=a/2;
for(n=0;n<j;n++)
{
for(f=0;f<j-n;f++)
{
c=a%2;
a=a/2;
}
a=b;
printf("%d",c);
}
printf("\n");
}
return 0;
}
然后我试着改了一下 似乎成立了 结果一试发现输入f8h是对的 225h是错的
#include<stdio.h>
int main()
{
int a,b,c,d,m,i,j,n,f,g;
printf("请输入一个数m:");
scanf("%d",&m);
for(i=0;i<m;i++)
{
printf("请输入一个16进制数");
scanf("%x",&a);
g=getchar();
b=a;
d=0;
for(j=0;a!=0;j++)
a=a/2;
for(n=0;n<j;n++)
{
for(f=0;f<j-n;f++)
{
c=a%2;
a=a/2;
}
d++;
if(d==1)
c++;
a=b;
printf("%d",c);
}
printf("\n");
}
return 0;
}
希望大神在小弟的基础上修改 这样我能看懂一点 如果我的算法本身就错误无法修改 希望给出的答案尽量简化表明注释 符合要求一定给分
14 个解决方案
#1
抱歉,没有完全理解你的算法,不过我觉得你考虑的太复杂了。16进制转2进制,每一位转换成4位。特殊考虑第一个数字,其它的采用映射机制。保证让你0ms
char *nTmp[]={"0000","0001","0010","0011".....};剩下的你懂的。
char *nTmp[]={"0000","0001","0010","0011".....};剩下的你懂的。
#2
你的方法不行的 无法保证整数前不加无效的0.
而且我水平很菜 无法看懂你的代码 是c吗?acm似乎只允许java和c 真心没看懂你那个是数据组吗?
而且我水平很菜 无法看懂你的代码 是c吗?acm似乎只允许java和c 真心没看懂你那个是数据组吗?
#3
int main()
{
int a,i,j,c,d,m;
char strSequence[1000];
char *strNum[]={"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
printf("请输入一个数m:");
scanf("%d",&m);
for (i=0;i<m;++i)
{
d = 0;//d represent the nlength of Sequence
printf("请输入一个16进制数");
scanf("%x",&a);
while(a!=0)
{
c = a%16;
for(j=3;j>=0;j--)
strSequence[d++]=strNum[c][j];
a /= 16;
}
j = d-1;
while(strSequence[j]=='0')
j--;
for (;j>=0;--j)
{
printf("%c",strSequence[j]);
}
printf("\n");
}
return 0;
}
你可以验证下,不知道能不能过。输出格式不保证。我用空间换时间。所以事先存储了字符串。
#4
楼主,搞了好久才发现,你的第一样例是错的:
225H 二进制应该 为 001000100101 吧,即 1000100101
另外说一下,ACM中是不要提示输入的语句的吧,附个我的代码:
225H 二进制应该 为 001000100101 吧,即 1000100101
另外说一下,ACM中是不要提示输入的语句的吧,附个我的代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int a,b,c,d,m,i,j,n,f,g;
char str[100];
printf("请输入一个数m:");
scanf("%d",&m);
for(i=0;i<m;i++)
{
printf("请输入一个16进制数");
scanf("%x",&a);
getchar();
printf("%d\n", a);
memset(str, 0, sizeof(str));
itoa(a, str, 2);
printf("%s\n", str);
}
return 0;
}
#5
#include<stdio.h>
#include <string.h>
void s2bin(unsigned char num, char *str)
{
char *bin[] = {"0", "1", "10", "11", "100",
"101", "110", "111", "1000", "1001",
"1010", "1011", "1100", "1101", "1110", "1111"};
if (num >=0 && num <= 15)
{
strcpy(str, bin[num]);
}
}
void a2bin(const char *src, int len, char *dst)
{
char tmp[8];
unsigned char ch;
int i;
for (i=0; i<len; i++)
{
memset(tmp, 0, sizeof(tmp));
if (src[i] >= '0' && src[i] <= '9')
{
ch = src[i] - '0';
}
else if (src[i] >= 'a' && src[i] <= 'f')
{
ch = src[i] - 87;
}
else if (src[i] >= 'A' && src[i] <= 'F')
{
ch = src[i] - 55;
}
else
{
break;
}
s2bin(ch, tmp);
strcat(dst, tmp);
}
}
int main()
{
char str[128] = {0};
char *src = "F8";
a2bin(src, 2, str);
printf("%s\n", str);
return 0;
}
#6
++
#7
#include <stdio.h>
void print(int n, int i)
{
if (i <= n) {
print(n, i << 1);
printf("%1d", n&i && 1);
}
}
int main()
{
unsigned int n;
int m;
scanf("%d", &m);
while (m--) {
scanf("%x", &n);
print(n, 1);
putchar('\n');
}
return 0;
}
#8
你说的对了 不是说你的代码 代码我水品哇没看懂 255那个错了 我第二个代码似乎就对了 但是不知道原因
#9
又仔细看了一下 255 是1001010101没错
#10
楼主,你的贴子上不是写着 225吗????
#11
先确定到底是 225H,还是255H吧
#12
a=b;语句要放在前面,这样a的初值不会为0,一个小小疏忽。
#13
print(n, 1);
不解什么意思
不解什么意思
#14
意思是输出最后一位,呵呵,这段代码不足以解决楼主的问题,只是给楼主一个思路,,用位移反向输出,结束条件是位移后的数大于要输出的数,比如,要输出的数是0010 1101的话,那么,当1左移到0100 0000时,就大于需要输出的数了,就中止再向前移动,然后反相输出,这样就不用担心输出前面的0的问题了,
#1
抱歉,没有完全理解你的算法,不过我觉得你考虑的太复杂了。16进制转2进制,每一位转换成4位。特殊考虑第一个数字,其它的采用映射机制。保证让你0ms
char *nTmp[]={"0000","0001","0010","0011".....};剩下的你懂的。
char *nTmp[]={"0000","0001","0010","0011".....};剩下的你懂的。
#2
你的方法不行的 无法保证整数前不加无效的0.
而且我水平很菜 无法看懂你的代码 是c吗?acm似乎只允许java和c 真心没看懂你那个是数据组吗?
而且我水平很菜 无法看懂你的代码 是c吗?acm似乎只允许java和c 真心没看懂你那个是数据组吗?
#3
int main()
{
int a,i,j,c,d,m;
char strSequence[1000];
char *strNum[]={"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
printf("请输入一个数m:");
scanf("%d",&m);
for (i=0;i<m;++i)
{
d = 0;//d represent the nlength of Sequence
printf("请输入一个16进制数");
scanf("%x",&a);
while(a!=0)
{
c = a%16;
for(j=3;j>=0;j--)
strSequence[d++]=strNum[c][j];
a /= 16;
}
j = d-1;
while(strSequence[j]=='0')
j--;
for (;j>=0;--j)
{
printf("%c",strSequence[j]);
}
printf("\n");
}
return 0;
}
你可以验证下,不知道能不能过。输出格式不保证。我用空间换时间。所以事先存储了字符串。
#4
楼主,搞了好久才发现,你的第一样例是错的:
225H 二进制应该 为 001000100101 吧,即 1000100101
另外说一下,ACM中是不要提示输入的语句的吧,附个我的代码:
225H 二进制应该 为 001000100101 吧,即 1000100101
另外说一下,ACM中是不要提示输入的语句的吧,附个我的代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
int a,b,c,d,m,i,j,n,f,g;
char str[100];
printf("请输入一个数m:");
scanf("%d",&m);
for(i=0;i<m;i++)
{
printf("请输入一个16进制数");
scanf("%x",&a);
getchar();
printf("%d\n", a);
memset(str, 0, sizeof(str));
itoa(a, str, 2);
printf("%s\n", str);
}
return 0;
}
#5
#include<stdio.h>
#include <string.h>
void s2bin(unsigned char num, char *str)
{
char *bin[] = {"0", "1", "10", "11", "100",
"101", "110", "111", "1000", "1001",
"1010", "1011", "1100", "1101", "1110", "1111"};
if (num >=0 && num <= 15)
{
strcpy(str, bin[num]);
}
}
void a2bin(const char *src, int len, char *dst)
{
char tmp[8];
unsigned char ch;
int i;
for (i=0; i<len; i++)
{
memset(tmp, 0, sizeof(tmp));
if (src[i] >= '0' && src[i] <= '9')
{
ch = src[i] - '0';
}
else if (src[i] >= 'a' && src[i] <= 'f')
{
ch = src[i] - 87;
}
else if (src[i] >= 'A' && src[i] <= 'F')
{
ch = src[i] - 55;
}
else
{
break;
}
s2bin(ch, tmp);
strcat(dst, tmp);
}
}
int main()
{
char str[128] = {0};
char *src = "F8";
a2bin(src, 2, str);
printf("%s\n", str);
return 0;
}
#6
++
#7
#include <stdio.h>
void print(int n, int i)
{
if (i <= n) {
print(n, i << 1);
printf("%1d", n&i && 1);
}
}
int main()
{
unsigned int n;
int m;
scanf("%d", &m);
while (m--) {
scanf("%x", &n);
print(n, 1);
putchar('\n');
}
return 0;
}
#8
你说的对了 不是说你的代码 代码我水品哇没看懂 255那个错了 我第二个代码似乎就对了 但是不知道原因
#9
又仔细看了一下 255 是1001010101没错
#10
楼主,你的贴子上不是写着 225吗????
#11
先确定到底是 225H,还是255H吧
#12
a=b;语句要放在前面,这样a的初值不会为0,一个小小疏忽。
#13
print(n, 1);
不解什么意思
不解什么意思
#14
意思是输出最后一位,呵呵,这段代码不足以解决楼主的问题,只是给楼主一个思路,,用位移反向输出,结束条件是位移后的数大于要输出的数,比如,要输出的数是0010 1101的话,那么,当1左移到0100 0000时,就大于需要输出的数了,就中止再向前移动,然后反相输出,这样就不用担心输出前面的0的问题了,