大数加算減算法高精度四則演算


1.加算
入力は文字配列で保存し、入力を整形配列に存在させ、ビット単位で加算するとともに、キャリー処理に注意します.
#include 
#include 

int main()
{
    char m[555],n[555];
    int i,len_m,len_n,len_max,k;
    int a[555]={0},b[555]={0},c[555]={0};
    scanf("%s",m);
    len_m =strlen(m);
    for(i=0;i<=len_m -1;i++)
        a[i]=m[len_m -1 -i]-'0';
    scanf("%s",n);
    len_n=strlen(n);
    for(i=0;i<=len_n -1;i++)
        b[i]=n[len_n -1 -i]-'0';
    if(len_m>len_n)
        len_max=len_m;
    else
        len_max=len_n;
    k=0;
    for(i=0;i<=len_max -1;i++)
    {
        c[i]=(a[i]+b[i]+k)%10;
        k=(a[i]+b[i]+k)/10;
    }
    if(k!=0)	c[len_max]=1;
    if(c[len_max]==1)	printf("1");
    for(i=len_max -1;i>=0;i--)
        printf("%d",c[i]);
    return 0;
}

2.減算
原理は加算と同じ(2つの数の大きさの関係を確定しない)
2つの大きさを比較します:先に長さを比較して、更にビットで比較します(ビットで比較して書いていません)
#include 
#include 

int main()
{
    char m[555],n[555];
    int i,len_m,len_n;
    int a[555]={0},b[555]={0};
    scanf("%s",m);
    len_m =strlen(m);
    for(i=0;i<=len_m -1;i++)
        a[i]=m[len_m -1 -i]-'0';
    scanf("%s",n);
    len_n=strlen(n);
    for(i=0;i<=len_n -1;i++)
        b[i]=n[len_n -1 -i]-'0';
    if(len_m < len_n)	
    { 
    	printf("-");
    	for(i=0;i=0;i--)
        	printf("%d",b[i]);
	}
	else
	{
    	for(i=0;i=0;i--)
        	printf("%d",a[i]);
    }
    return 0;
}

3.乗算
原理的にも配列シミュレーションを採用している.
 a[i]123
 b[j]  12
c[k]で各演算結果を保存し、k=i+jである.
 c[i+j]=c[i+j]+a[i]*b[j];
乗算プロセスをシミュレートします.
             123
        *     12
       -------------
              246   
        +    123
       -------------
             1476
#include 
#include 

int main()
{
    char m[555],n[555],temp[555];
    int i,j,len_m,len_n;
    int a[555]={0},b[555]={0},c[1111]={0};
    scanf("%s",m);
    scanf("%s",n);
    if(strlen(m)=10)
    	{
    		c[i+1]+=c[i]/10;
    		c[i]%=10;
		}
	i=2*len_m;
	while(c[i]==0)	i--;
	if(i<0)	printf("0");
	else	
	{
		for(;i>=0;i--)
			printf("%d",c[i]);
	}
    return 0;
}

4.除算
除算も配列シミュレーションを利用するが,ここでは直接除算の演算ではなく,除算を減算に変換して結果を求める.#include #include int len1,len2; char s1[905],s2[905]; int re[905]; void sub() { int i=0,j; while(1) { if(s1[i]=='0') i++; else { j=i; break; } } for(;ij;i--) // 0 if(s1[i]=0) // , { sub(); re[p]++; } p++; if(len1==len2) break; for(i=len2-1;i>=0;i--) // s2 0, s2[i+1]=s2[i]; s2[0]='0'; len2++; s2[len2]='\0'; } i=0; while(1) { if(re[i]==0) i++; else break; } for(;i