当前位置: 代码迷 >> 综合 >> analysis of difference about computing big_integer
  详细解决方案

analysis of difference about computing big_integer

热度:3   发布时间:2023-12-06 05:45:48.0

// 
加法:01 单组数据 不用后续处理进位ans[i]=( a[i]+b[i]+pro )%10;pro=( a[i]+b[i]+pro )/10;02 多组数据 用中间值temp 也不用后续处理进位temp=ans[i]+str[i]+pro;ans[i]=temp%10;pro=temp/10;

大整数加法

Integer Inquiry

' 大整数加法 '
pro=0;                      // 进位符
for( i=0;i<=len;i++ )       // <= 处理最高位的进位
{ans[i]=( a[i]+b[i]+pro )%10;pro=( a[i]+b[i]+pro )/10;
}' Integer Inquiry '
pro=0;
for( i=0;i<=N;i++ )     // N   数据不大 不用长度优化也行 
{temp=ans[i]+str[i]+pro;ans[i]=temp%10;pro=temp/10;
}

//
乘法:
01 大数*大数 单组数据 先不处理进位 后续用 无中间量的计算 进位ans[pos++]+=a[i]*b[j]; 或 ans[i+j]+=a[i]*b[j];ans[i+1]+=ans[i]/10;ans[i]%=10;02 ( 阶乘 ) 大数*小数 多组数据 用中间值temp   while 更新最高位 优化   注意下标范围temp=ans[j]*i+pro;ans[j]=temp%10;pro=temp/10;while( pro ){// 更新最高位ans[pos++]=pro%10;pro/=10;}

 大整数乘法

 Bull Math

求10000以内n的阶乘

' 大整数乘法 '
for( i=0;i<=len;i++ )     // a[i]
{pos=i;for( j=0;j<=len;j++ )   // b[i]{ans[pos++]+=a[i]*b[j];}
}for( i=0;i<=405;i++ )
{ans[i+1]+=ans[i]/10;ans[i]%=10;
}' Bull Math '
for( i=0;i<=len;i++ )
{pos=i;for( j=0;j<=len;j++ ){ans[pos++]+=a[i]*b[j];}
}// not while. Because maybe exist zero. deffer form factorial.
for( i=0;i<=2*len+3;i++ )
{ans[i+1]+=ans[i]/10;ans[i]%=10;
}' 求10000以内n的阶乘 '
pro=0;// 不可 j<=pos ! 下方 while 确定当前 ans[pos] 的结果
for( j=0;j<pos;j++ )
{// *i 有别大数乘法temp=ans[j]*i+pro;ans[j]=temp%10;pro=temp/10;
}// 用 while 确定最高位 优化
while( pro )
{// 更新最高位ans[pos++]=pro%10;pro/=10;
}

//
阶乘·快速幂:
01 普通阶乘  大数*小数的模板 ( 可计算长度优化 同 )temp=ans[j]*i+pro;ans[j]=temp%10;pro=temp/10;02 快速幂 ( 不能用 大数*小数模板(阶乘) )// 大数*大数ans[pos++]+=a[i]*b[j]; 或 ans[i+j]+=a[i]*b[j];ans[i+1]+=ans[i]/10;ans[i]%=10;//
======// 中间数组temp temp[i+j]+=a[i]*b[j];       temp[i+1]+=temp[i]/10;a[i]=temp[i]%10;  //   
======// (递归) 两个数组 b is ans, a is tempif( p&1 ) a[ i+j-1 ]+=b[i]*b[j]*2;      else      a[ i+j-1 ]+=b[i]*b[j];        a[i+1]+=a[i]/10;b[i]=a[i]%10;//

计算2的N次方

麦森数

' 计算2的N次方 '  ( 可以用麦森数的快速幂 )
int todo( int len )
{int i,pro=0;//  <=  进位 for( i=0;i<=len;i++ ){ans[i]=ans[i]*2+pro;    // 初值pro=ans[i]/10;          // 进位ans[i]%=10;             // 终值}// 计算长度for( ;ans[i]==0;i-- );// 返回下标( 实际长度==下标+1 )return i;
}
...
for( i=0;i<n;i++ )
{// 传入实际长度  返回下标 len=todo( len+1 );
}' 麦森数 'for( i=0;i<MAXN+5;i++ ){for( j=0;i+j<MAXN+5;j++ )     // 只保留500位{c[i+j]+=a[j]*b[i];}}for( i=0;i<MAXN;i++ ){c[i+1]+=c[i]/10;            //a[i]=c[i]%10;}-------------------------------------for( i=1;i<=MAXN+5;i++ ){// i+j<=MAXN+5   i+j==MAXN 时 还不能停下for( j=1;i+j<=MAXN+5;j++ )     {if( p&1 ) a[ i+j-1 ]+=b[i]*b[j]*2;      else      a[ i+j-1 ]+=b[i]*b[j];        }}for( i=1;i<=MAXN;i++ ){a[i+1]+=a[i]/10;b[i]=a[i]%10;}memset( a,0,sizeof(a) );-------------------------------------for( i=0;i<MAXN+5;i++ ){for( j=0;i+j<MAXN+5;j++ ){temp[i+j]+=a[i]*b[j];       // += // a[i] b[i]}}for( i=0;i<=MAXN;i++ ){temp[i+1]+=temp[i]/10;a[i]=temp[i]%10;                // [i]}

  相关解决方案