一道acm的练习题 出点毛病请指点绝对结贴

时间:2022-06-20 12:09:31
输入数据
    第一行为一个整数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".....};剩下的你懂的。

#2


引用 1 楼  的回复:
抱歉,没有完全理解你的算法,不过我觉得你考虑的太复杂了。16进制转2进制,每一位转换成4位。特殊考虑第一个数字,其它的采用映射机制。保证让你0ms
char *nTmp[]={"0000","0001","0010","0011".....};剩下的你懂的。
你的方法不行的  无法保证整数前不加无效的0.
 而且我水平很菜 无法看懂你的代码   是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中是不要提示输入的语句的吧,附个我的代码:


#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


引用 5 楼  的回复:
C/C++ code

#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",
……


++

#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


引用 4 楼  的回复:
楼主,搞了好久才发现,你的第一样例是错的:
225H 二进制应该 为  001000100101 吧,即 1000100101

另外说一下,ACM中是不要提示输入的语句的吧,附个我的代码:

C/C++ code

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    int a,b,c,d……
你说的对了   不是说你的代码  代码我水品哇没看懂   255那个错了   我第二个代码似乎就对了 但是不知道原因

#9


引用 4 楼  的回复:
楼主,搞了好久才发现,你的第一样例是错的:
225H 二进制应该 为  001000100101 吧,即 1000100101

另外说一下,ACM中是不要提示输入的语句的吧,附个我的代码:

C/C++ code

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    int a,b,c,d……
又仔细看了一下  255 是1001010101没错

#10


楼主,你的贴子上不是写着 225吗????

#11


引用楼主  的回复:
输入数据
  第一行为一个整数m,表示测试用列数;接下来有m行,每一行表示一个测试用例,每个测试用例为一个以H结尾的十六进制的整数n。
输出数据
  十六进制整数n对应的二进制数在一行输出,多个测试结果顺序输出,之间没有空行,整数前不加无效的0.
输入样例
2
225H
F8H
输出样例
1001010101
11111000


下面是我编写的总是在输出二进制的开头会出……

先确定到底是 225H,还是255H吧

#12


a=b;语句要放在前面,这样a的初值不会为0,一个小小疏忽。

#13


引用 7 楼  的回复:
C/C++ code
#include <stdio.h>

void print(int n, int i)
{
    if (i <= n) {
        print(n, i << 1);
        printf("%1d", n&amp;i &amp;&amp; 1);
    }
}

int main()
{
    unsigned int n;
    int m……
print(n, 1);
不解什么意思

#14


引用 13 楼  的回复:
引用 7 楼  的回复:

C/C++ code
#include <stdio.h>

void print(int n, int i)
{
if (i <= n) {
print(n, i << 1);
printf("%1d", n&amp;amp;i &amp;amp;&amp;amp; 1);
}
}

int main()
{
unsigned int ……

意思是输出最后一位,呵呵,这段代码不足以解决楼主的问题,只是给楼主一个思路,,用位移反向输出,结束条件是位移后的数大于要输出的数,比如,要输出的数是0010 1101的话,那么,当1左移到0100 0000时,就大于需要输出的数了,就中止再向前移动,然后反相输出,这样就不用担心输出前面的0的问题了,

#1


抱歉,没有完全理解你的算法,不过我觉得你考虑的太复杂了。16进制转2进制,每一位转换成4位。特殊考虑第一个数字,其它的采用映射机制。保证让你0ms
char *nTmp[]={"0000","0001","0010","0011".....};剩下的你懂的。

#2


引用 1 楼  的回复:
抱歉,没有完全理解你的算法,不过我觉得你考虑的太复杂了。16进制转2进制,每一位转换成4位。特殊考虑第一个数字,其它的采用映射机制。保证让你0ms
char *nTmp[]={"0000","0001","0010","0011".....};剩下的你懂的。
你的方法不行的  无法保证整数前不加无效的0.
 而且我水平很菜 无法看懂你的代码   是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中是不要提示输入的语句的吧,附个我的代码:


#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


引用 5 楼  的回复:
C/C++ code

#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",
……


++

#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


引用 4 楼  的回复:
楼主,搞了好久才发现,你的第一样例是错的:
225H 二进制应该 为  001000100101 吧,即 1000100101

另外说一下,ACM中是不要提示输入的语句的吧,附个我的代码:

C/C++ code

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    int a,b,c,d……
你说的对了   不是说你的代码  代码我水品哇没看懂   255那个错了   我第二个代码似乎就对了 但是不知道原因

#9


引用 4 楼  的回复:
楼主,搞了好久才发现,你的第一样例是错的:
225H 二进制应该 为  001000100101 吧,即 1000100101

另外说一下,ACM中是不要提示输入的语句的吧,附个我的代码:

C/C++ code

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    int a,b,c,d……
又仔细看了一下  255 是1001010101没错

#10


楼主,你的贴子上不是写着 225吗????

#11


引用楼主  的回复:
输入数据
  第一行为一个整数m,表示测试用列数;接下来有m行,每一行表示一个测试用例,每个测试用例为一个以H结尾的十六进制的整数n。
输出数据
  十六进制整数n对应的二进制数在一行输出,多个测试结果顺序输出,之间没有空行,整数前不加无效的0.
输入样例
2
225H
F8H
输出样例
1001010101
11111000


下面是我编写的总是在输出二进制的开头会出……

先确定到底是 225H,还是255H吧

#12


a=b;语句要放在前面,这样a的初值不会为0,一个小小疏忽。

#13


引用 7 楼  的回复:
C/C++ code
#include <stdio.h>

void print(int n, int i)
{
    if (i <= n) {
        print(n, i << 1);
        printf("%1d", n&amp;i &amp;&amp; 1);
    }
}

int main()
{
    unsigned int n;
    int m……
print(n, 1);
不解什么意思

#14


引用 13 楼  的回复:
引用 7 楼  的回复:

C/C++ code
#include <stdio.h>

void print(int n, int i)
{
if (i <= n) {
print(n, i << 1);
printf("%1d", n&amp;amp;i &amp;amp;&amp;amp; 1);
}
}

int main()
{
unsigned int ……

意思是输出最后一位,呵呵,这段代码不足以解决楼主的问题,只是给楼主一个思路,,用位移反向输出,结束条件是位移后的数大于要输出的数,比如,要输出的数是0010 1101的话,那么,当1左移到0100 0000时,就大于需要输出的数了,就中止再向前移动,然后反相输出,这样就不用担心输出前面的0的问题了,