1. 程式人生 > >shadow wolf’s blog

shadow wolf’s blog

高精度加法

原理:

將數字分成陣列存入,逐位相加

原來int的要開很大的,如10000000000000000,或者有些long long都不夠,在char裡面只要17位

Q:為什麼?

A:因為原來是將一個數存入,現在分成字元存入陣列,進行加法運算

首先將讀入的字元存入int陣列

讀入資料1:


	for(int i=1;i<=a[0];i++){
		a[i]=a1[a[0]-i]-'0';
	}

讀入資料2:


	for(int j=1;j<=b[0];j++){
		b[j]=b1[b[0]-j]-'0';
	}
	

讀入之後

c陣列負責加法運算

lenc是c的長度

x是進位的多少,如果這個數小於10,除以10是0

都懂吧?

	while(lenc<=e){
	
		c[lenc]=a[lenc]+b[lenc]+x;
			x=c[lenc]/10;
			c[lenc]%=10;
			lenc++;
		
		
}

然後輸出: 

	for(int i=lenc;i>=1;i--){
	printf("%d",c[i]);
	}

整段程式碼:

#include<cstdio>
#include<string>
using namespace std;
	char a1[100],b1[100];
int a[100],b[100],c[100],x=0,e,lenc=1;
int maxaaa(int a,int b){
	if(a>b){
		return a;
	}else return b;
}
int main(){
	
	gets(a1);
	gets(b1);
	a[0]=strlen(a1);
	b[0]=strlen(b1);
	e=maxaaa(a[0],b[0]);
	for(int i=1;i<=a[0];i++){
		a[i]=a1[a[0]-i]-'0';
	}
	for(int j=1;j<=b[0];j++){
		b[j]=b1[b[0]-j]-'0';
	}
	while(lenc<=e){
	
		c[lenc]=a[lenc]+b[lenc]+x;
			x=c[lenc]/10;
			c[lenc]%=10;
			lenc++;
		
		
}
if(c[lenc]==0){
	lenc--;
}

	for(int i=lenc;i>=1;i--){
	printf("%d",c[i]);
	}
	
	
	return 0;
}