大数相乘

大数相乘的相关知识

http://blog.youkuaiyun.com/chhuach2005/article/details/21168179

逐位相乘处理进位法

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* getbigdata(char *dataA, char* dataB)
{
    int  Negative = 1;//记录正负号
    if (dataA == NULL || dataB == NULL)
        return "NULL pointer";
    if ((dataA[0] == '+' && dataB[0] == '-') || (dataA[0] == '-' && dataB[0] == '+'))
        Negative = -1;
    if ( (dataA[0] != '+'  && dataA[0] != '-') && dataB[0] == '-')
        Negative = -1;
    if (dataA[0] == '-' && (dataB[0] != '+' && dataB[0] != '-' ) )
        Negative = -1;

    if (dataA[0] == '+' || dataA[0] == '-')
    {
        dataA = dataA + 1;
    }
    if (dataB[0] == '+' || dataB[0] == '-')
    {
        dataB = dataB + 1;
    }
    int lengthA = strlen(dataA);
    int lengthB = strlen(dataB);
    for (int k = 0; k < lengthA; k++)
    {
        if (dataA[k] > '9' || dataA[k] < '0')
        {
            return "Not a digital string";
        }
    }
    for (int k = 0; k < lengthB; k++)
    {
        if (dataB[k] > '9' || dataB[k] < '0')
        {
            return "Not a digital string";
        }
    }

    int *press = malloc(sizeof(int)*(lengthA + lengthB));

    memset(press, 0, sizeof(int)*(lengthA + lengthB));//清空此内存,初始化零
    //累乘
    for (int i = 0; i < lengthA;i++)
    {
        for (int j = 0; j < lengthB;j++)
        {
            press[i + j + 1] += (dataA[i] - '0')*(dataB[j] - '0');//i+j+1预留一位防止最高位进位

        }
    }
    for (int i = lengthA + lengthB - 1; i >= 0; i--)
    {
        if (press[i] >= 10)//进位
        {
            press[i - 1] += press[i] / 10;//十位
            press[i] %= 10;//取出个位数
        }
    }   
    int i = 0;
    while (press[i] == 0)
    {
        i++;//恰好不为0
    }
    char *lastres = malloc(sizeof(char)*(lengthA + lengthB)+1);//+1存正负号
    int j = 0;
    if (Negative == -1)
    {
        lastres[j] = '-';
        for (j = 1; j < lengthA + lengthB + 1; j++, i++)//前面-已经占了一位
        {
            lastres[j] = press[i] + '0';
        }
    }
    else
    {
        for (j = 0; j < lengthA + lengthB; j++, i++)
        {
            lastres[j] = press[i] + '0';
        }
    }
    lastres[j] = '\0';
    return lastres;
}
void main()
{
    char str1[100] = { 0 };
    char str2[100] = { 0 };
    scanf("%s%s", str1, str2);

    printf("str1=%s\nstr2=%s", str1, str2);

    char * Answer = getbigdata(str1, str2);

    printf("\nAnswer=%s\n", Answer);

    system("pause");


}

为帮助理解分析累乘的循环,注意这里是从高位开始累乘的,前面空一个是防止进位;
例如12345*12

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值