Example #1
0
//right param is litter one
Bigint operator *(Bigint num1,Bigint num2)
{	
#if 1
	static bool s_first = 1;

	if(num2.getlength() == 0|| num1.getlength() ==0||
		strcmp(num2.getptr(), "0") == 0 ||
		strcmp(num1.getptr(), "0") == 0)
		return "0";
	if (s_first && num1<num2){num1.swap(num2);}

	s_first = 0;
#endif

	int nlen1 = num1.getlength();
	int nlen2 = num2.getlength();
	//memory leak
	ptr_array<char> sum = new char[nlen1+1+1];
	memset(sum.getptr() , 0, nlen1+2);
	int flag = 0;

	int nindex = 0;
	for(; nindex < nlen1; nindex++)
	{
		int num = (num2.getindex(nlen2-1)-'0')*(num1.getindex(nlen1 - nindex - 1)-'0') +flag;
		sum[nindex] = num%10 +'0';
		flag = num/10;
	}
	if(flag) sum[nindex] = flag +'0';
	makestr(sum.getptr());
	//memory leak
	ptr_array<char> pleft =new char[nlen2+1];
	strcpy(pleft.getptr(), num2.getptr());
	pleft[num2.getlength() - 1] = 0;

//	Bigint temp =ten(num1*pleft);
	return (Bigint(sum.getptr()) + ten(num1*pleft.getptr()));
}
Example #2
0
Bigint operator+(const Bigint& num1, 
				 const Bigint& num2)
{
	int nlen1 = num1.getlength();
	int nlen2 = num2.getlength();
	const Bigint &maxint = nlen1>=nlen2?num1:num2;
	const Bigint &minint = nlen1>=nlen2?num2:num1;

	//申请的字节数永远比最长的数多1.但计算的时候按不进位计算
	//memory leak
	ptr_array<char> ptr(new char[maxint.getlength()+1+1]);
	Bigint temp = ptr.getptr();
	memset(temp.getptr(), 0, maxint.getlength()+1+1);

	int maxindex = maxint.getlength() -1;
	int minindex = minint.getlength() -1;
	int nindex  = strlen(maxint.getptr()) -1;

	int nmax = maxint.getlength();
	int nmin = minint.getlength();

	bool flag = false;

	for(int max = maxint.getlength(); max>0; max--)
	{
		temp.getindex(nindex) = (maxint.getindex(maxindex--) + (minindex>=0?minint.getindex(minindex--):'0') +flag -'0');
		flag = false;
		if( temp.getindex(nindex--)> '9')
		{
			flag = true;
			temp.getindex(nindex+1) = (temp.getindex(nindex+1) % ('9'+1)) +'0';
		}
	}
	if(flag)
	{
		for (int i=temp.getlength(); i>0; i--)
		{
			temp.getindex(i) = temp.getindex(i-1);
		}
		temp.getindex(0) = '1';
	}

	return temp;
}