大数相乘的相关知识
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