大数(高精度)运算知识点

高精度可以直接使用java,java的相关基础知识还需要掌握
如果使用c++就要用字符串形式读入,然后转化为数字数组模拟手算过程,一般0号元素记录数组的长度

高精度的储存:
注意是倒序存储

void init(int a[]){
	string s;
	cin>>s;//读入字符串s
	a[0]=s.length();//用a[0]计算字符串s的位数
	for(i=1;i<=a[0];i++)
		a[i]=s[a[0]-i]-'0';//将数串s转换为数组a,并倒序存储.
}

高精度数的比较

int compare (int a[],int b[]){
	if (a[0]>b[0]) return 1;//a的位数大于b则a比b大
	if (a[0]0;i--) //从高位到低位比较
	{	if (a[i]>b[i]) return 1;
		if (a[i]

高精度输出:

void print(int a[]) {
	int i;
	if (a[0]==0){
		cout<<0<0;i--) cout<

高精度加法:

void jia(int a[],int b[]) {//计算a=a+b 
	int i,k;
	if(a[0]0) a[0]++;//修正新的a的位数(a+b最多只能的一个进位)
}

如果是n进制的运算:
1、当前位规范由%10改为% n
2、进位处理由/10改为/n
3、其他运算规则不变

高精度减法:

void jian(int a[],int b[]){
	int flag,i;
	flag=compare(a,b); //调用比较函数判断大小
	if (flag==0) {
		a[0]=0;
		return;
	}//相等
	for(i=1;i<=a[0];i++) {
		if(a[i]

高精度乘单精度:

int chengshu(int a[],int k) { 
	int i;
	if(k==0){for(i=0;i<=101;i++)a[i]=0;a[0]=0;return 0;} //处理k=0
	for(i=1;i<=a[0];i++)a[i]=a[i]*k;//先每位乘起来
	
	for(i=1;i<=a[0];i++) {//进位
		a[i+1]+=a[i]/10;
		a[i]%=10;
	}
	while(a[a[0]+1]>0){//处理最高位相乘的进位
		a[0]++;
		a[a[0]+1]=a[a[0]]/10;
		a[a[0]]=a[a[0]]%10;
	}
return 0;
}

高精度乘高精度

void cheng (int a[],int b[],int c[]){ 
	int i,j,len;
	for (i=1;i<=a[0];i++)
		for (j=1;j<=b[0];j++){
			c[i+j-1]+=a[i]*b[j];
		}

	c[0]=a[0]+b[0];		
	for(i=1;i<=c[0];i++){//进位
		c[i+1]+=c[i]/10;
		c[i]%=10;
	}
	while(c[0]>0&&c[c[0]]==0)c[0]--;
return ;
}

高精度除单精度 (从高位开始除,和前面三种运算不同)

void chushu(int a[],int b,int c[],int d){//c=a/b,d=a%b
	int i;
	d=0; //余数初始化
	for(i=a[0];i>=1;i--){//按照由高位到底位的顺序,逐位相除
		d=d*10+a[i]; //接受了来自第i+1位的余数
		c[i]=d/b; //计算商的第i位
		d=d%b;
	}//计算第i位的余数
	c[0]=a[0];
	while(c[0]>0&&c[c[0]]==0)c[0]--;//计算商的有效位数
return ;
}

高精度除高精度

void chu(int a[],int b[],int c[]){
	int i,j,tmp[101];
	c[0]=a[0]-b[0]+1;
	for (i=c[0];i>0;i--){
		memset(tmp,0,sizeof(tmp));//数组清零
		numcpy(b,tmp,i); //将b拷贝到tmp的第i位,其余位是0
		while(compare(a,tmp)>=0){
			c[i]++;
			jian(a,tmp);
		}//用减法来模拟
	}
	while(c[0]>0&&c[c[0]]==0)c[0]--;
return ;
}

你可能感兴趣的:(知识点总结)