1. 程式人生 > >c++高精度運算(加、乘)

c++高精度運算(加、乘)

#include <stdio.h>
#include <iostream>
#include <memory.h>
#include <math.h>

using namespace std;

#define MI 1000

/*****************high precision computation********************/
int hpcAdd(char* a,char* b,int lena,int lenb,char *re)
{
	memset(re,0,MI);
	
	char rest=0;
	char tmp=0;
	int len=max(lena,lenb);
	int i;
	
	for(i=0;i<len;i++)
	{
		tmp=a[i]+b[i]+rest;
		re[i]=tmp%10;
		rest=tmp/10;
	}
	if(rest>0)
	{
		len++;
		re[len-1]=rest;
	}
	
	return len;
}

int hpcMui(char* a,char* b,int lena,int lenb,char *re)
{
	memset(re,0,MI+MI);
	
	char rest=0;
	char tmp=0;
	int len;
	int i,j,l;
	
	for(i=0;i<lena;i++)
	{
		for(j=0;j<lenb;j++)
		{
			tmp=a[i]*b[j];
			re[i+j]+=tmp%10;
			re[i+j+1]+=tmp/10;
			l=i+j;
			while(re[l]>=10)
			{
				re[l]=re[l]%10;
				tmp=re[l]/10;
				re[++l]+=tmp;
			}
		}
	}
	
	for(i=MI*2-1;i>=0;i--)
	{
		if(re[i]!=0)
		{
			break;
		}
	}
	i++;
	len=i;
	cout<<len<<endl;
	return len;
}

char turnUpsideDown(char* a,int lena)
{
	//陣列逆置
	int i;int j;char t;
	i=0;
	j=lena-1;
	while(i<j)
	{
		t=a[i];
		a[i]=a[j];
		a[j]=t;
		++i;
		--j;
	}
	
	return 0;
}

char turntooutput(char *a,int len)
{
	int i;
	for(i=0;i<len;++i)
	{
		a[i]+=48;
	}
}

int main()
{
	cout<<"Input the two number:";
	char tina[MI],tinb[MI];
	char a[MI];
	char b[MI];
	char aAdd[MI];
	int ladd;
	char aMui[MI+MI];
	int lmui;
	memset(a,0,MI);
	memset(b,0,MI);
	int lena,lenb;
	cin>>tina>>tinb;
	cout<<endl; //一次性讀入使用者輸入的資料 
	int i,j;
	char t;
	i=0;
	j=0;
	
	//解析資料
	while( 48<=tina[i] && tina[i]<=57 && i<MI)
	{
		a[i]=tina[i]-48;
		++i;
	}
	lena=i;
	
	while( 48<=tinb[j] && tinb[j]<=57 && i<MI)
	{
		b[j]=tinb[j]-48;
		++j;
	}
	lenb=j;

	turnUpsideDown(a,lena); //陣列逆置 
	turnUpsideDown(b,lenb); //陣列逆置

	ladd=hpcAdd(a,b,lena,lenb,aAdd);
	lmui=hpcMui(a,b,lena,lenb,aMui);

	turnUpsideDown(aAdd,ladd);
	turntooutput(aAdd,ladd);
	turnUpsideDown(aMui,lmui);
	turntooutput(aMui,lmui);
	cout<<aAdd<<endl<<aMui<<endl;

	return 0;
 }