大数相乘

引入

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

点赞