大數加法 減法 乘法 除法 高精度四則運算

1. 加法

輸入採用字符數組保存,然後將輸入存在整形數組裏,然後逐位相加即可,同時注意進位處理。

#include <stdio.h>
#include <string.h>

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. 減法

原理同加法一樣(不確定兩個數的大小關係)

比較兩數大小:先比較長度,再按位比較(按位比較沒寫)

#include <stdio.h>
#include <string.h>

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<len_n;i++)
    	{
   			b[i]-=a[i];
   			if(b[i]<0)
   			{
   				b[i]+=10;
   				b[i+1]--;
			}
		}
		i=len_n-1;
		while(b[i]==0)	i--; 
    	for(;i>=0;i--)
        	printf("%d",b[i]);
	}
	else
	{
    	for(i=0;i<len_m;i++)
    	{
   			a[i]-=b[i];
   			if(a[i]<0)
   			{
   				a[i]+=10;
   				a[i+1]--;
			}
		}
		i=len_m-1;
		while(a[i]==0)	i--; 
    	for(;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 <stdio.h>
#include <string.h>

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)<strlen(n))
    {
    	strcpy(temp,m);
		strcpy(m,n);
        strcpy(n,temp);
	}
    len_m =strlen(m);
    for(i=0;i<=len_m -1;i++)
        a[i]=m[len_m -1 -i]-'0';
    len_n=strlen(n);
    for(i=0;i<=len_n -1;i++)
        b[i]=n[len_n -1 -i]-'0';
    for(i=0;i<len_n;i++)
    	for(j=0;j<len_m;j++)
    		c[i+j]+=a[j]*b[i];
    for(i=0;i<2*len_m;i++)
    	if(c[i]>=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 <stdio.h>
#include <string.h>

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(;i<len2;i++)
        s1[i]=s1[i]-s2[i]+'0';
    for(i=len2-1;i>j;i--)    		//低位開始檢測是否小於0
        if(s1[i]<'0')
        {
            s1[i]+=10;
            s1[i-1]--;
        }
}

int main()
{
    int i,p;
    scanf("%s%s",s1,s2); 
    len1=strlen(s1);
    len2=strlen(s2);
    if(len1<len2 || (len1==len2 && strncmp(s1,s2,len2)<0))   //如果a<b,直接輸出0
		printf("0\n"); 
    p=0;
    while(1)
    {
        re[p]=0;
        while(strncmp(s1,s2,len2)>=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<p;i++)
        printf("%d",re[i]);
    return 0;
} 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章