这道题本身难度并不大,关键要解决负数的取余数的问题,正常情况下比如-3除以-2应该得1余 -1
而这里我们不想让余数为负数,因为我们需要得到二进制串,所以增加判定条件当余数为-1时(求除以-2的余数只可能为-1或者0)余数变为1,得到的商增加1。剩下的步骤和一般求二进制串的步骤基本相同。
但是这道题目实际上还是一个高精度的问题,面对10的100次幂也就是100位的整数我们无法存储在int或是long int中,则需要用到高精度的除法,可以先用int来做,写出基本的函数,再构造高精度整数的输入和除法函数。
我在这里构造了一个divi函数实现高精度除以低精度,返回余数。先将整数数组复制在temp数组,再从最高位开始,对rem乘10加上对应位除以除数即得到对应位的数字,返回余数给rem,再在次高位重复直到i=0。
value函数当bigint=0时返回0,其余返回1
one_plus函数使对bigint数组加1并进位(这里没考虑溢出因为除以-2后不可能还会溢出)
主函数就是处理字符,这里的bigint负数时,所有位数都为负数(比如-15就存-5 -1 0 0......)。注意区分strlen()和sizeof()的区别,这里求字符数组定义的部分长度因此用strlen
#include <stdio.h>
#include <string.h>
#define Max 101//十进制数长度
int divi(int* a,int N)//高精度整数数组引入,实现除法返回余数
{
int i=0;
int temp[Max];
while(i<Max)
{
temp[i]=a[i];
i++;
}
i=Max;int rem=0;
while(i>=0)
{
rem=rem*10+temp[i];
a[i]=rem/N;
rem%=N;
i--;
}
return rem;
}
int value(int* a)
{
for(int i=0;i<Max;i++)
{
if(a[i]==0) continue;
else return 1;
}
return 0;
}
int one_plus(int* a)
{
a[0]+=1;
for(int i=0;i<Max;i++)
{
if(a[i]==10) {a[i]=0;a[i+1]+=1;}
else continue;
}
}
int main()
{
char input[Max+1];
scanf("%s",&input);
int len=strlen(input);//input的长度
char *p = &input[len-1];
int bigint[Max]={0};
int out[500];
int flag = 0;
if(input[0]=='-')
{
flag=-1;
}
int i=0;
if(flag==-1)
{
while(i<len-1)
{
bigint[i] = '0'- *p;
i++;p--;
}
}
else if(flag==0)
{
while(i<len)
{
bigint[i] = *p -'0';
i++;p--;
}
}
int k=0;
if(value(bigint)==0)
{
printf("%d",0);
return 0;
}
while(value(bigint)!=0)
{
int yu = divi(bigint,-2);
if(yu==-1)
{
yu=1;
one_plus(bigint);
}
out[k]=yu;
k++;
}
for(int i=k-1;i>=0;i--)
{
printf("%d",out[i]);
}
return 0;
}