Time Limit: 1000 ms
Memory Limit: 32768 mb
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出
输入描述:
多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)
输出描述:
每行输出对应的二进制数。
输入样例#:
0
1
3
8
输出样例#:
0
1
11
1000
分析:考察点是进制转换,难点是涉及到大数。
int类型在C语言中占4个字节,即32个二进制位。当表示正数时,最高位为符号位(符号位为0),最大的正数是 0111 1111 1111 1111 1111 1111 1111 1111 即2^31 -1 = 2147483647。当表示负数时,最高位为符号位(符号位为1),最小的负数是 1000 0000 0000 0000 0000 0000 0000 0000 而在计算机中是以补码的形式存储的,C语言规定 1000 0000 0000 0000 0000 0000 0000 0000 的补码为-2147483648。所以C语言中int的取值范围为:-2147483648~2147483647
但是本题中有30位长度,明显超过了int型变量的范围,因此可以尝试一下以下思路。
思路:
进制转换的精髓就在于除n取余,那么可以运用手动除法运算的方法,具体如下:
1/2=0
1%2=1。
k=1.
12/2=6
12%2=0
k=0
3/2=1
3%2=1
k=1
6/2=3
6%2=0
k=0
1/2=0
1%2=1
k=1。
3/2=1
3%2=1
k=1
10/2=5
10%2=0
k=0。
1/2=0
1%2=1
k=1
15/2=7
15%2=1
k=1。
7/2=3
7%2=1
k=1
3/2=1
3%2=1
k=1
1/2=0
1%2=1
k=1
代码如下:
#include<stdio.h>
#include<string.h>
void conservatemton(int m,char *s,int n){
int len=strlen(s);
int k,lastn=0;
char result[32]={'0'};
for (int i = 0; i < len; )
{
k=0;
for (int j = i; j < len; ++j)
{
int t=(k*m+s[j]-'0')%n;
s[j]=(k*m+s[j]-'0')/n+'0';
k=t;
}
lastn++;
result[lastn]=((char)(k+'0'));
while(s[i]=='0')i++;
}
for (int k = strlen(result); k >0; k--)
{
printf("%c",result[k]);
}
printf("\n");
}
int main(int argc, char const *argv[])
{
char a[100];
while(~scanf("%s",a)){
conservatemton(10,a,2);
}
return 0;
}
这里在自己电脑可以运行,但是在oj上提示runtime error,这里是因为在函数内部每一次都开辟一个result数组,导致报此类错误,于是进行了改进,设置result数组为公共变量,这就避免了报错,但是注意同时要增加对于result数组的初始化工作。
#include<stdio.h>
#include<string.h>
char result[32];
void conservatemton(int m,char *s,int n){
int len=strlen(s);
int k,lastn=0;
for (int i = 0; i <32; ++i)
{
result[i]='\0';
}
for (int i = 0; i < len;)
{
k=0;
for (int j = i; j < len; ++j)
{
int t=(k*m+s[j]-'0')%n;
s[j]=(k*m+s[j]-'0')/n+'0';
k=t;
}
result[lastn++]=((char)k+'0');
while(s[i]=='0')i++;
}
for (int k = lastn-1; k >=0; --k)
{
printf("%c",result[k]);
}
printf("\n");
}
int main(int argc, char const *argv[])
{
char a[32];
while(~scanf("%s",a)){
conservatemton(10,a,2);
}
return 0;
}
这样就可以ac了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)