大数相加与相乘

//先说相加

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    char num1[200];
    char num2[200];
    //用以存放反转后的字符串
    char num3[200];
    char num4[200];
    //用以存放结果,到时候从后往前输出即可
    char result[201];
    memset(num1, 0, 200);
    memset(num2, 0, 200);
    memset(num3, 0, 200);
    memset(num4, 0, 200);
    memset(result, 0, 201);
    cin >> num1 >> num2;
    //字符串反转
    int count = 0;
    for (int i = strlen(num1)-1; i >=0; --i)
    {
        num3[count++] = num1[i];
    }
    count = 0;
    for (int i = strlen(num2) - 1; i >= 0; --i)
    {
        num4[count++] = num2[i];
    }
    int maxlen = strlen(num1) > strlen(num2) ? strlen(num1) : strlen(num2);
    for (int i = 0; i < maxlen; ++i)
    {
        result[i] = num3[i] + num4[i] -'0';
    }
    //进位
    for (int i = 0; i < strlen(result); ++i)
    {
        if (result[i] > '9')
        {
            result[i] = result[i] - 10;
            result[i + 1] += 1;
        }
    }
    //为了防止这一位是进位上来的,而不是原来就有的,所以先判断一下然后加上    ‘0’
    if (result[strlen(result) - 1] < '0')
        result[strlen(result) - 1] += '0';
    //输出
    for (int i = strlen(result) - 1; i >= 0; --i)
    {
        cout << result[i];
    }


    system("pause");
    return 0;
}

//相乘(经测试只能乘不是很大的数,原因是某个小于10的数乘以一个大数还是不够安全,以后会加上加强版的,估计就是继续进行拆分,(●ˇ∀ˇ●))

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    char num1[100];
    char num2[100];
    //用以存放反转后的字符串
    char num3[100];
    char num4[100];
    //用以存放结果,到时候从后往前输出即可,这里换成long long类型而不是char类型(cahr方便输出),因为相加的时候数字比较小,char可以存下,相乘就不行了
    long long result[101];

    memset(num1, 0, 100);
    memset(num2, 0, 100);
    memset(num3, 0, 100);
    memset(num4, 0, 100);
    for (int i = 0; i < 101; ++i)
        result[i] = 0;
    cin >> num1 >> num2;
    //字符串反转
    int count = 0;
    for (int i = strlen(num1) - 1; i >= 0; --i)
    {
        num3[count++] = num1[i];
    }
    count = 0;
    for (int i = strlen(num2) - 1; i >= 0; --i)
    {
        num4[count++] = num2[i];
    }
    //开始乘啦
    int flag = 0;//result的位数
    for (int i = 0; i < strlen(num3); ++i)
    {
        count = 0;//位数

        for (int j = 0; j < strlen(num4); ++j)
        {
            result[flag]+=(num3[i]-'0')*(num4[j]-'0')*pow(10,count);
            ++count;
        }
        ++flag;
    }
    //进位
    for (int i = 0; i < 101; ++i)
    {
        if (result[i] > 9)
        {
            result[i + 1] += (result[i] / 10);
            result[i] %= 10;
        }
    }
    //防止输出不必要的0
    for (int i = 100;; --i)
    {
        if (result[i] != 0)
        {
            count = i;
            break;
        }
    }

    for (int i = count; i >= 0; --i)
        cout << result[i];

    system("pause");
    return 0;
}

//今天下课回来的路上一直在想着怎么解决昨晚遗留的问题,问题主要是即使分解了原来的数,但是第一个数的每一位还是要和另一个数相乘,当数字过大时显然不能存放下,所以还得进行分解,于是想到了二维数组。,下面是代码:(我分别测试了一下两者,发现差距还不小呢(●ˇ∀ˇ●))

#include<iostream>
#include<cstring>
using namespace std;
//问为什么要在主函数外定义这些数组。他们现在属于全局变量,存放在中静态存储区中,而主函数中的数组存放在栈中,显然前者空间比较大,因此我们定义一个过大的数组或容器,应当把它把它定义为全局变量为宜
char num1[1000];
char num2[1000];
//用以存放反转后的字符串
char num3[1000];
char num4[1000];
//用以存放结果,到时候从后往前输出即可,这里换成long long类型而不是char类型(cahr方便输出),因为相加的时候数字比较小,char可以存下,相乘就不行了
long long result[1001][1001];//通过之前的教训,即使是这样也不能计算比较大的数,所以设成二维数组
int main()
{
    memset(num1, 0, 1000);
    memset(num2, 0, 1000);
    memset(num3, 0, 1000);
    memset(num4, 0, 1000);
    for (int i = 0; i < 1001; ++i)
        for(int j=0;j<1001;++j)
        result[i][j] = 0;
    cin >> num1 >> num2;
    //字符串反转
    int count = 0;
    for (int i = strlen(num1) - 1; i >= 0; --i)
    {
        num3[count++] = num1[i];
    }
    count = 0;
    for (int i = strlen(num2) - 1; i >= 0; --i)
    {
        num4[count++] = num2[i];
    }
    //开始乘啦
    int flag = 0;//result的位数
    for (int i = 0; i < strlen(num3); ++i)
    {
        count = i;//这样就能每次乘的时候自动往前填数,而不是始终从0开始,到时候还得移位

        for (int j = 0; j < strlen(num4); ++j)
        {
            result[i][count++] = (num3[i] - '0')*(num4[j] - '0');
        }
        ++flag;
    }
    //进位
    for (int i = 0; i <= flag; ++i)
    {
        for (int j = 0; j < 1001; ++j)
        {
            if (result[i][j] > 9)
            {
                result[i][j + 1] += result[i][j] / 10;
                result[i][j] %= 10;
            }
        }
    }
    //将所有的数相加
    int finalresult[1001];
    for (int i = 0; i < 1001; ++i)
        finalresult[i] = 0;
    for (int j = 0; j < 1001; ++j)
    {
        for (int i = 0; i < 1001; ++i)
        {
            finalresult[j] += result[i][j];
        }
    }
    //最终结果进位
    for (int i = 0; i < 1001; ++i)
    {
        if (finalresult[i] > 9)
        {
            finalresult[i + 1] += finalresult[i] / 10;
            finalresult[i] %= 10;
        }
    }
    //防止输出不必要的0
    for (int i = 1000;; --i)
    {
        if (finalresult[i] != 0)
        {
            count = i;
            break;
        }
    }
    //逆序输出
    for (; count >= 0; --count)
    {
        cout << finalresult[count];
    }
    system("pause");
    return 0;
}

下面是测试内容:
第一种相乘:
这里写图片描述
看,如果出现这种稍大些的数就溢出了。

再来看看第二种:
这里写图片描述
还是好好的呢(●ˇ∀ˇ●)

再来更变态的:
这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值