引入
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;
}