大数加算減算法高精度四則演算
3407 ワード
1.加算
入力は文字配列で保存し、入力を整形配列に存在させ、ビット単位で加算するとともに、キャリー処理に注意します.
2.減算
原理は加算と同じ(2つの数の大きさの関係を確定しない)
2つの大きさを比較します:先に長さを比較して、更にビットで比較します(ビットで比較して書いていません)
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
4.除算
除算も配列シミュレーションを利用するが,ここでは直接除算の演算ではなく,除算を減算に変換して結果を求める.
入力は文字配列で保存し、入力を整形配列に存在させ、ビット単位で加算するとともに、キャリー処理に注意します.
#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