高精度乘法(简单小白版)

简介: 高精度乘法(简单小白版)

高精度乘法

麻烦的模拟题,核心在于大数乘小数中(A*b),将大数A中的每一位与小数b相乘,用进位p表示所需进位,然后逐一更新大数A中的每一位



值得注意的是,大数A需要倒序存储,因为当需要进位的时候,一直向上填数组位置即可;若不倒序存储,进位时就会在a[-1]位置进位,这样会造成段错误  

#include<iostream>
using namespace std;
int a[100000];
int n,cnt=0;
void f(int n)
{
    if(n==0) cout<<0<<endl;
    else
    {
        int p=0;//记录进位
        for(int j=0;j<=cnt;j++)//更新每一位
        {
            p=a[j]*n+p;
            a[j]=p%10;
            p=p/10;
        }
        while(p!=0)
        {
            cnt++;
            a[cnt]=p%10;
            p=p/10;
        }
        for(int i=cnt;i>=0;i--)
          cout<<a[i];
    }
}
int main()
{
    string s;
    cin>>s;
    for(int i=s.size()-1;i>=0;i--)
        a[cnt++]=s[i]-'0';
    cnt--;//cnt保证没有前导0
    cin>>n;
    f(n);
    return 0;
}

该代码使用了数组来存储高精度整数,并实现了高精度的乘法运算。在主函数中,输入两个字符串表示的高精度整数,然后调用mul函数进行乘法计算并输出结果。


需要注意的是,该代码中的高精度乘法并没有考虑负数的情况,如果需要支持负数的乘法运算,需要在代码中增加相关的处理逻辑。


C++模拟,利用vector容器直接模拟运算即可  

#include<iostream>
#include<vector>
using namespace std;
vector<int> mul(vector<int>& A,int b)
{
    vector<int> C;
    int t=0;
    for(int i=0;i<A.size();i++)
    {
        t+=A[i]*b;
        C.push_back(t%10);
        t/=10;
    }
    while(t)
    {
        C.push_back(t%10);
        t/=10;
    }
    while(C.size()>1&&C.back()==0) C.pop_back();//去除前导0
    return C;
}
int main()
{
    string a;
    int b;
    cin>>a>>b;
    vector<int> A;
    for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
    vector<int> C=mul(A,b);
    for(int i=C.size()-1;i>=0;i--) cout<<C[i];
    return 0;
}

高精度乘法应用

阶乘计算

#include<iostream>
using namespace std;
void f(int n)
{
    if (n == 1)
        cout << "1";
    else
    {
        int a[100000], tail = 0, head = 0, p = 0;
        a[0] = 1;
        for (int i = 2; i <= n; i++) {
            for (int j = head; j <= tail; j++)
            {
                p = a[j] * i + p;
                a[j] = p % 10;
                p = p / 10;
            }
            while (p != 0)
            {
                tail++;
                a[tail] = p % 10;
                p = p / 10;
            }
        }
        for (int i = tail; i >= 0; i--)
            cout << a[i];
    }
}
int main()
{
    int n;
    cin >> n;
    f(n);
    return 0;
}

该代码将阶乘计算分解成了一个个乘法运算。在主函数中,输入一个整数n,然后调用fac函数计算n的阶乘。在fac函数中。

tail用于去除前导0

相关文章
|
3月前
|
前端开发 JavaScript 开发工具
给前端小白的学习建议
【7月更文挑战第4天】 **前端新手入门指南:** - 明确目标,从HTML/CSS基础开始。 - 深入学习JavaScript,结合项目实战。 - 跟踪技术趋势,选一二框架钻研。 - 多实践,从小项目到复杂应用。 - 掌握开发工具与调试技巧。 - 培养解决问题的能力,保持好奇与耐心。 - 加入社区,分享交流,持之以恒,成为优秀前端开发者。
42 2
|
5月前
|
JavaScript
小白也理解了v-on
小白也理解了v-on
|
IDE Unix Linux
小白学python(1)
小白学python(1)
|
编解码 iOS开发 异构计算
3分钟安装fcpx10.6.5最新 小白一看就会
Final Cut Pro 是Mac OS平台上最好的视频剪辑软件,Final Cut Pro为原生64位软件,基于Cocoa编写,支持多路多核心处理器,支持GPU加速,支持后台渲染,可编辑从标清到4K的各种分辨率视频,ColorSync管理的色彩流水线则可保证全片色彩的一致性。 经过完整而彻底的重新设计后,Final Cut Pro 为后期制作工作流程的方方面面增添了无与伦比的速度、质量和灵活性。
3分钟安装fcpx10.6.5最新 小白一看就会
|
Linux 容器
计算机基础知识(基础入门小白专属)八
计算机基础知识(基础入门小白专属)八
|
Linux 芯片 Windows
计算机基础知识(基础入门小白专属)九
计算机基础知识(基础入门小白专属)九
3分钟安装Dropzone 4 小白一看就会
Dropzone 是一款Mac上的文件拖拽操作增强工具,这款软件可以让我们把大部分工作都通过拖拽来完成,比如保存文本、发送邮件、FTP上传、打开应用等等,只需要将文件拖拽到菜单栏上的窗口中即可,并且我们完全可以定制化这些操作,可以在官网上下载定制好的各种动作。
3分钟安装Dropzone 4 小白一看就会
|
机器学习/深度学习 存储 算法
写给小白看的硬核递归(低调点,当回小白)
递归:就是函数自己调用自己。 子问题须与原始问题为同样的事,或者更为简单。 递归通常可以简单的处理子问题,但是不一定是最好的解决方式。
91 0
写给小白看的硬核递归(低调点,当回小白)
|
前端开发
前端小白
---来着对高薪的渴望
55 0
|
Java 关系型数据库 MySQL
小白使用
一个小白怎么使用云服务器
173 1
小白使用