大数相乘

来源:互联网 发布:网络聊天电台 编辑:程序博客网 时间:2024/05/20 21:44

大数相乘的相关知识

http://blog.csdn.net/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

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

0 0