本题使用了写好的高精度整数的模板,将ten2N()函数的输出方式稍微改了改。
debug过程:
①重载的*运算通过这道题发现了bug:当输入的int x为0时,由于使用的是BigInt与int逐位乘的算法,故若BigInt的intSize不为1的话,会return一个值为0但intSize!=0的BigInt对象(这种BigInt对象是不能容忍的)导致出错。故加入了修正代码,修改后如下:
BigInt operator*(int x)const{//contain int2BigInt()
BigInt pro;
pro.initBigInt();
/*look here*/ if (x==0){ //防止当x=0时return一个值为0但intSize!=0的BigInt
pro.int2BigInt(0);
return pro;
}
int c=0;
int i;
for (i=0;i<intSize;i++){
pro.digit[i]=digit[i]*x+c;
c=pro.digit[i]/10000;
pro.digit[i]%=10000;
}
pro.intSize=i;
while (c>0){
pro.digit[pro.intSize++]=c%10000;
c/=10000;
}
return pro;
}
②在输入的十进制BigInt转化为二进制时,使用了存储输入的s串再对这次输出进行存储。而题目说输入的十进制数位数<=1000,极限情况时其转化的二进制串远大于1000,此时便会发生数组越界。故要扩大s的容量。
int main(){
char s[5000];//bug****
-
题目描述:
-
对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们乘B为A的二进制逆序数。
例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。
-
输入:
-
一个1000位(即10^999)以内的十进制数。
-
输出:
-
输入的十进制数的二进制逆序数。
-
样例输入:
-
173
-
样例输出:
-
181
-
答疑:
- 解题遇到问题?分享解题心得?讨论本题请访问: http://t.jobdu.com/thread-7931-1-1.html
#include <iostream>
#include <cstring>
#include <iomanip>
#define MAXSIZE 1000
using namespace std;
struct BigInt{
int digit[MAXSIZE];
int intSize;
void initBigInt(){//初值不为0,而是NULL(intSize=0)
for (int i=0;i<MAXSIZE;i++)
digit[i]=0;
intSize=0;
}
void int2BigInt(int x){
initBigInt();
do{//注意这里与n进制化成十进制一样,也要考虑x=0的情况 ********
digit[intSize]=x%10000;
intSize++;
x/=10000;
}while (x>0);
}
void char2BigInt(char *s){
initBigInt();
int weight;
for (int i=strlen(s)-1;i>=0;i-=4){
weight=1;
for (int j=i;j>i-4&&j>=0;j--){
digit[intSize]+=(s[j]-'0')*weight;
weight*=10;
}
intSize++;
}
}
BigInt operator+(const BigInt &a)const{
BigInt sum;
sum.initBigInt();
int c=0;
int i;
for (i=0;i<intSize||i<a.intSize;i++){
sum.digit[i]=c+digit[i]+a.digit[i];
c=sum.digit[i]/10000;
sum.digit[i]%=10000;
}
sum.intSize=i;
if (c!=0)
sum.digit[sum.intSize++]=c;
return sum;
}
BigInt operator*(int x)const{
BigInt pro;
pro.initBigInt();
if (x==0){ //
pro.int2BigInt(0); //
return pro; //bug****
}
int c=0;
int i;
for (i=0;i<intSize;i++){
pro.digit[i]=digit[i]*x+c;
c=pro.digit[i]/10000;
pro.digit[i]%=10000;
}
pro.intSize=i;
while (c>0){
pro.digit[pro.intSize++]=c%10000;
c/=10000;
}
return pro;
}
BigInt operator/(const int x)const{//x<10000
BigInt answer;
answer.initBigInt();
int c=0;
for (int i=intSize-1;i>=0;i--){
answer.digit[i]=digit[i]+c*10000;
c=answer.digit[i]%x;
answer.digit[i]/=x;
}
answer.intSize=intSize!=1&&answer.digit[intSize-1]==0?intSize-1:intSize;//必须同时满足 intSize!=1才能排除掉输入本身即为0的情况,
//否则输入为0的话会出现answer.intSizse=0的错误赋值。
return answer;
}
int operator%(const int x)const{//x<10000
int temp,c=0;
for (int i=intSize-1;i>=0;i--){
temp=digit[i]+c*10000;
c=temp%x;
}
return c;
}
void print(){
for (int i=intSize-1;i>=0;i--){
cout<<setfill('0')<<setw(i==intSize-1?0:4)<<digit[i];
}
cout<<endl;
}
};
void m2Ten(char *s,int m,BigInt &x){//s[] is the number inputed,switch m to 10,store the answer in x
BigInt weight;
x.initBigInt();
weight.int2BigInt(1);
int temp;
for (int i=strlen(s)-1;i>=0;i--){
temp=s[i]-('0'<=s[i]&&s[i]<='9'?'0':'A'-10);
x=x+weight*temp;
weight=weight*m;
}
}
void ten2N(BigInt &x,int n,char *s){//the decimal num is in x,switch 10 to n,store the output in stack
int c;
int len=0;
do{//至少做一次以防x=0时空栈 //****
c=x%n;
x=x/n;
s[len]=c+'0';
len++;
} while (!(x.digit[0]==0&&x.intSize==1));
s[len]='\0';
}
int main(){
char s[5000];//bug****
BigInt x;
while (cin>>s){
//initiate
x.char2BigInt(s);
//process
ten2N(x,2,s);
m2Ten(s,2,x);
//output
x.print();
}
return true;
}