九度OJ-1208:10进制 VS 2进制

  本题使用了写好的高精度整数的模板,将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
来源:
2007年清华大学计算机研究生机试真题
答疑:
解题遇到问题?分享解题心得?讨论本题请访问: 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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值