zoukankan      html  css  js  c++  java
  • 大数相乘算法

    蓝桥杯例题

    当两个比较大的整数相乘时,可能会出现数据溢出的情形。为避免溢出,
    可以采用字符串的方法来实现两个大数之间的乘法。具体来说,
    首先以字符串的形式输入两个整数,每个整数的长度不会超过8位,
    然后把它们相乘的结果存储在另一个字符串当中(长度不会超过16位),
    最后把这个字符串打印出来。例如,假设用户输入为:62773417和12345678,
    则输出结果为:774980393241726.

    算法设计思路-点击这里

    算法实现代码C++

    const int maxn = 100;
    int a[maxn],b[maxn];
    int len1,len2;
    int ans[maxn];
    char aim[maxn];
    
    int main(){
        //freopen("in.txt","r",stdin);
        //读入并将数据方向反转
        memset(aim,0,sizeof(aim));
        scanf("%s",aim);
        len1 = strlen(aim);
        int cur = 0;
        for(int i=len1-1;i>=0;i--){
            a[cur++] = aim[i] - '0';
        }
        memset(aim,0,sizeof(aim));
        scanf("%s",aim);
        len2 = strlen(aim);
        cur = 0;
        for(int i=len2-1;i>=0;i--){
            b[cur++] = aim[i] - '0';
        }
        //完成输入
        memset(ans,0,sizeof(ans));
        for(int i=0;i<len1;i++){//a
            for(int k=0;k<len2;k++){//b
                //下面这句话要结合所给博客思路重点理解
                ans[i+k] += (a[i]*b[k]);
            }
        }
        //开始进位
        int jin = 0;
        for(int i=0;i<len1+len2;i++){
            ans[i] += jin;
            jin = ans[i] / 10;
            ans[i] %= 10;
        }
        //输出
        int s = len1 + len2;
        while(ans[s]==0)s--;
        for(int i=s;i>=0;i--){
            cout<<ans[i];
        }
        cout<<endl;
        return 0;
    }
    //774980393241726
    //774980393241726
    

    OK

  • 相关阅读:
    快速幂&欧拉降幂
    欧拉函数
    素数打表-筛法
    多源最短路径问题(Floyd算法)
    蓝桥杯-本质上升序列
    蓝桥杯-玩具蛇
    SDUT-计算机组成原理
    取消U盘和移动硬盘的GPT保护分区
    Windows 10 上运行 photoshop 等软件出现 loadlibrary failed with error 87 的解决方法!
    做题笔记
  • 原文地址:https://www.cnblogs.com/savennist/p/13821800.html
Copyright © 2011-2022 走看看