[高精度]高精細乗算
9396 ワード
#include
#include<string.h>
int d,a[10000],b[10000];
char s[10000],ss[10000],c[100000];
int work()
{
int len=strlen(s);
for(int i=0;i<len;i++)
a[len-1-i]=s[i]-'0';
int jw=0;
for(int i=0;i<len;i++)
{
a[i]=a[i]*d+jw;
jw=a[i]/10;
a[i]%=10;
}
if(jw!=0)
{
a[len]=jw;
}
while(a[len]>=10)
{
a[len+1]=a[len]/10;
a[len]%=10;
len++;
}
while(a[len-1]==0 && len>1)
len--;
for(int i=len;i>=0;i--)
printf("%d",a[i]);
}
int workb()
{
memset(c,0,sizeof(c));
int len=strlen(s);
for(int i=0;i<len;i++)
a[len-1-i]=s[i]-'0';
int lenn=strlen(ss);
for(int i=0;i<len;i++)
b[lenn-1-i]=ss[i]-'0';
for(int i=0;i<len;i++)
for(int j=0;jint l=len+lenn-1;
for(int i=0;i1]+=c[i]/10;
c[i]%=10;
}
if(c[l]>0) l++;
while(c[l-1]>=10)
{
c[l]=c[l-1]/10;
c[l-1]%=10;
l++;
}
while(c[l-1]==0 && l>1)
l--;
for(int i=l-1;i>=0;i--)
printf("%d",c[i]);
}
int main()
{
while(scanf("%s%s",s,ss))
{
workb();
}
}
セグメント解読:work:高精*低精第1段:文字列を整形配列に変換(演算を容易にするために逆順序で書き込む)リセットキャリー
int len=strlen(s);
for(int i=0;i<len;i++)
a[len-1-i]=s[i]-'0';
int jw=0;
第2段:各ビットをd(低精整数)に乗算する.10より大きい場合はキャリー
for(int i=0;ii++)
{
a[i]=a[i]*d+jw;
jw=a[i]/10;
a[i]%=10;
}
第三段:頭位進位問題を処理し、whileは0を除く.注意:0を全部取り除くことはできません
if(jw!=0)
{
a[len]=jw;
}
while(a[len]>=10)
{
a[len+1]=a[len]/10;
a[len]%=10;
len++;
}
while(a[len-1]==0 && len>1)
len--;
出力workb:高精*高精第1段:第1段:文字列を整形配列に変換(演算を容易にするために逆順に書き込む)一時配列をリセット
memset(c,0,sizeof(c));
int len=strlen(s);
for(int i=0;i1-i]=s[i]-'0';
int lenn=strlen(ss);
for(int i=0;i1-i]=ss[i]-'0';
第2段:a[i]とb[ii]を乗算し、結果をc[ii+i]に加算する
for(int i=0;ii++)
for(int j=0;jj++)
{
c[i+j]+=a[i]*b[j];
}
第3段:処理進位、処理ヘッド進位、while去0;
int l=len+lenn-1;
for(int i=0;ii++)
{
c[i+1]+=c[i]/10;
c[i]%=10;
}
if(c[l]>0) l++;
while(c[l-1]>=10)
{
c[l]=c[l-1]/10;
c[l-1]%=10;
l++;
}
while(c[l-1]==0 && l>1)
l--;
出力