算法导论@大数相乘

题目要求:两个较大的数相乘。以字符串输入两个较大的数,结果保存在字符串中。

注意:
字符串转整数 1-‘0’


处理方式一:

#include"cheng.h"
#define MAX 100
//大数相乘
int main()
{
    char *a = (char*)malloc(sizeof(char)), *b = (char*)malloc(sizeof(char));
    char *res = (char*)malloc(sizeof(char));
    char *m = (char*)malloc(sizeof(char)), *n = (char*)malloc(sizeof(char));
    int carry = 0;
    //处理输入
    cout << "输入两个大数:" << endl;
    cin >> a;
    cin >> b;

    //翻转字符串
    for (int i = 0; i < strlen(a); i++)
    {
        m[i] = a[strlen(a) - i - 1];
    }
    m[strlen(a)] = NULL;

    for (int i = 0; i < strlen(b); i++)
    {
        n[i] = b[strlen(b) - i - 1];
    }
    n[strlen(b)] = NULL;

    //存放结果的字符串清零
    for (int i = 0; i < strlen(a) + strlen(b); i++)
    {
        res[i] = 0;
    }

    //保存结果
    for (int i = 0; i < strlen(a) ; i++)
    {
        for (int j = 0;  j < strlen(b); j++)
        {
            res[i + j] += (m[i] - '0')*(n[j] - '0');
        }
    }

    //进位,移位处理
    for (int i = 0; i < strlen(a)+strlen(b); i++)
    {
        char temp = res[i];
        res[i] = (res[i]+carry)% 10;
        carry = (temp + carry) / 10;

    }

    //若最高位为0,则从次高位开始输出
    if (res[strlen(a) + strlen(b) - 1] == 0)
    {
        for (int i = strlen(a) + strlen(b) - 2; i >= 0; i--)
        {
            printf("%d",res[i]);
        }
    }
    else
    {
        for (int i = strlen(a) + strlen(b) - 1; i >= 0; i--)
        {
            printf("%d", res[i]);
        }

    }

    system("pause");
    return 0;
}

处理方式二:

#include"cheng.h"
#define MAX 100
//大数相乘
int main()
{
    //字符串指针a,b用于接受输入的两个大数
    char *a = (char*)malloc(sizeof(char));
    char *b = (char*)malloc(sizeof(char));

    //字符串指针res用于保存最后的结果
    char *res = (char*)malloc(sizeof(char));

    //进位标志
    int carry = 0;

    //m,n数组用来保存a,b转换为整数后的值
    int m[MAX], n[MAX];

    //输入:
    cout << "请输入两个大数:" << endl;
    cin >> a;
    cin >> b;

    //将字符串逆序排列,并转换为整数
    for (int i = 0; i < strlen(a); i++)
    {
        m[i] = a[strlen(a)-i-1]-'0';
        //指针形式访问
        //m[i]=*(a+strlen(a)-i-1)-'0';
    }

    for (int i = 0; i < strlen(b); i++)
    {
        n[i] = b[strlen(b) - i - 1]-'0';
        //指针形式访问
        //n[i]=*(b+strlen(b)-i-1)-'0';
    }

    //保存结果的整型数组result
    int result[MAX] = { 0 };

    for (int i = 0; i < strlen(a); i++)
    {
        for (int j = 0; j < strlen(b); j++)
        {
            result[i + j] += m[i] * n[j];
        }
    }

    //进位,移位处理
    int temp = 0;
    for (int i = 0; i < strlen(a) + strlen(b); i++)
    {
        temp = result[i];
        result[i] = (result[i] + carry) % 10;
        carry = (temp + carry) / 10;
    }
    /***************
    if (result[strlen(a) + strlen(b) - 1] == 0)
    {
        for (int i = strlen(a) + strlen(b) - 2; i >= 0; i--)
        {
            cout << result[i] ;
        }
    }
    else
    {
        for (int i = strlen(a) + strlen(b) - 1; i >= 0; i--)
        {
            cout << result[i];
        }
    }
    ***************/


    //将结果数组转换为字符串
    //注意判断,最高位是0,则从次高位输出
    if (result[strlen(a) + strlen(b)-1] == 0)
    {
        int index = 0;
        for (int i = strlen(a) + strlen(b)-2; i >=0; i--)
        {
            res[index++] = result[i] + '0';
        }
        res[index] = NULL;
    }
    else
    {
        int index = 0;
        for (int i = strlen(a) + strlen(b) - 1; i >= 0; i--)
        {
            res[index++] = result[i] + '0';
        }
        res[index] = NULL;
    }
    printf("%s", res);

    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值