关于大数的相乘与相加

大数相乘:
(思路参考某姜学长所得)
▶运用vector数组可用vector.size()方便快速求解;
▶模仿小学加减乘除的法则,发现两数相乘时位数为最终结果的相加位数;也是多亏数组是从0开始计数的,不然无法成立
例:

         1 2
   x     2 3
   ————————
        3 6(6是第0位与第0位相乘之数,加在结果的第0 + 0 = 0位。3是0与1,则加1+0=0位)
   + 2  4(4是第1位与第0位相乘之数,则加在结果第1 + 0=1位)
  _______________
  =   276

题目描述
警告:距离开学还有8个小时~

小刺猬:什么,明天就要开学了,可是我数学作业还没有写,小灰,我需要你的帮助,不然要被老妈扣除零花钱了。

小灰:嗯?可是自己的作业要自己完成才对吧。

小刺猬:可是…我上课的时候没有认真听课。

小灰:明天我会给你带早餐过来的~加油啦,要靠自己。

看着作业本上满满的题目,小刺猬开始翻起了书。

输入
输入共一行,包含一个仅由数字和乘号组成的算术表达式。

表达式的运算结果为R(0 ≤ R ≤ 101000)。

输出
输出共一行,表示表达式的运算结果。

样例输入

1 * 2 * 3 * 4 * 5 * 6

样例输出

720
解题源码:

#include <iostream>
#include <string.h>
#include <vector>
#include <string>

using namespace std;

string xiangcheng(const string &a,const string &b)
{
    vector<int> a1(a.size(),0);
    vector<int> b1(b.size(),0);
    vector<int> muti(a.size() + b.size(),0);

    for(int k = a.size() - 1,h = 0;k >= 0;k--,h++)
        a1[h] = a[k] - '0';

    for(int k = b.size() - 1,h = 0;k >= 0;k--,h++)
        b1[h] = b[k] - '0';

    for(int k = 0;k < a1.size();k++)
    {
        for(int h = 0;h < b1.size();h++)
        {
            muti[h + k] += a1[k] * b1[h];//加在结果k + h位,注意结果数组为 += 而不是 = ;
        }
    }

    for(int k = 0;k < muti.size();k++)
    {
        if(muti[k] >= 10)
        {
            muti[k + 1] += muti[k] / 10;//大于十进行进位
            muti[k] %= 10;
        }
    }

    int k = muti.size() - 1;
    string tem = "";

    for(;k >= 0 && !muti[k];k--);//判断相乘一共有多少位数;


    if(k < 0)
        return "0";//不要忘记0的存在
    else
        for(;k >= 0;k--)
        tem += muti[k] + '0';
    return tem;
}

int main()
{
    string a, tem = "1";
    while(getline(cin,a,'*'))
    {
        tem = xiangcheng(a,tem);
        //cout << tem << endl;
    }
    cout << tem << endl;
}

大数相加:

类比小学相加,更为简单;

题目描述
高精度加法就是两个很大的、位数很多的数字相加。

输入
第一行有一个整数T,表示接下来有T组数据,对于每组,输入两行,每行表示一个非负整数(不超过200位)。

输出
T行数,每行一个数,是相应输入组的两数之和。

解题代码:

#include <iostream>
#include <algorithm>
#include <string.h>
#include <stdlib.h>
using namespace std;
#define m 1000001
int shuzi1[m], shuzi2[m], c[m];
int main()
{
 
    int n;
    cin >> n;
    while(n--)
    {
        memset(shuzi1,0,sizeof(shuzi1));
        memset(shuzi2,0,sizeof(shuzi2));
        memset(c,0,sizeof(c));
        string a, b;
        int g = 0;
        cin >> a >> b;
        for(int k = a.length() - 1, j = 0;k >= 0;k--,j++)
        {
            shuzi1[j] = (int)(a[k] - '0');
 
        }
        for(int k = b.length() - 1, j = 0;k >= 0;k--,j++)
        {
            shuzi2[j] = (int)(b[k] - '0');
        }
        int h = max(a.size(),b.size());
        for(int k = 0;k < h;k++)
        {
            c[k] = shuzi1[k] + shuzi2[k] + c[k];
            if(c[k] >= 10)
            {
 
                g = 1;
                c[k] = c[k] - 10;
                c[k + 1] = c[ k + 1] + 1;
            }
            if(k == h -1 && g == 1)//判断是否相加为零;
            {
                h++;
                break;
            }
            g = 0;
        }
       int i;
       for (i = m - 1; (c[i] == 0) && (i >= 0); i--);
       if (i >= 0) {
        for (; i >= 0; i--)
            cout << c[i];
        cout << endl;
    }
    else cout << '0' << endl;
    }
}
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值