引入
1.確定兩個大數的具體位數/長度(len1,len2),並且將他們各自存入數組中;
2.創建一箇中間變量數組t1,長度爲(len1+len2)-1(可以自己隨便寫個乘法的豎式就知道了);
3.按照豎式運算的方式,逐位相乘,而後同位相加,存入t1中;
4.創建中間變量數組t2,初始化全爲0,長度爲len1+len2(預防第一位有進位),原因是兩數相乘結果一定是(len1+len2)或者(len1+len2-1)位;
5.t1和t2尾部對齊,進行進位運算,具體轉化公式如下,(如果看不明白可以自己手算一個999*99)
i:len1+len2 -> 1 (從len1+len2 到1 )
t1[i-1] += t2[i] //加上進位
t2[i] = t1[i-1]%10;//計算進位之後本位的值
t2[i-1] = t1[i-1]/10;//計算進位位
6.如此之後答案已經存在,t2之中,則只需判斷t2第一位是不是0即可,若是0,則去掉0輸出結果;若不是0,則直接輸出結果即可。
題目練習
用高精度方法,求n!的精確值(n以一般整數輸入)。
輸入一個整數n(n可能很大)
輸出高精度n!
樣例輸入:10
樣例輸出:3628800
我的代碼:
#include <iostream>
#include <cstring>
#include <sstream>
using namespace std;
int len_a=1;
int* ans=new int();
void fun(int* x, int len_x)
{
int t[len_x+len_a-1] ={0};
int tt[len_x+len_a]={0};
for(int i=0; i<len_x; i++)
for(int j=0; j<len_a; j++)
t[i+j]+=x[i]*ans[j];
for(int i=len_a+len_x-1; i>=1; i--)
{
t[i-1]+=tt[i];
tt[i]=t[i-1]%10;
tt[i-1]=t[i-1]/10;
}
if(tt[0]==0)
{
len_a=len_x+len_a-1;
for(int i=1;i<len_a+1;i++)
ans[i-1]=tt[i];
}
else
{
len_a=len_x+len_a;
for(int i=0;i<len_a;i++)
ans[i]=tt[i];
}
}
int main()
{
int n;
cin>>n;
ans[0]=1;
for(int i=2;i<=n;i++)
{
string str_t;
stringstream ss;
ss<<i;
ss>>str_t;
int len_t=str_t.length();
int t[len_t];
for(int j=0; j<len_t; j++)
{
stringstream ss1;
ss1<<str_t[j];
ss1>>t[j];
}
fun(t,len_t);
}
for(int i=0; i<len_a;i++)
cout<<ans[i];
return 0;
}