题目:
大数据相乘,会出现溢出的那种
分析:
这种题目,现在网上有很多类似的题目,比如大数相乘,相加等,方法还是相似的,采用字符串模拟。
代码如下:
/*
* bigDataMulti.cpp
*
* Created on: 2012-10-7
* Author: happier
*/
#include <iostream>
#include <string.h>
#include <cstdio>
using namespace std;
void reverseOrder(char *a, int start, int end)
{
char temp;
while(start < end)
{
temp = a[start];
a[start] = a[end];
a[end] = temp;
start++;
end--;
}
return ;
}
void reverseOrder(int *a, int start, int end)
{
int temp;
while(start < end)
{
temp = a[start];
a[start] = a[end];
a[end] = temp;
start++;
end--;
}
return ;
}
void multiply2(char *a, char *b)
{
int len1 = strlen(a);
int len2 = strlen(b);
reverseOrder(a, 0, len1 - 1);
reverseOrder(b, 0, len2 - 1);
int* result = (int *)malloc(sizeof(int) * (len1 + len2));
memset(result,0,sizeof(int)*(len1 + len2)); //初始化设置为0
for(int i = 0; i < len1; i++)
{
for(int j = 0; j < len2; j++)
{
result[i+j] += (a[i] - '0')*(b[j] - '0'); //a[i]*b[j]保存到a[i+j]中
}
}
int carry = 0;
for(int i = 0; i < len1 + len2; i++)
{
result[i] += carry;
carry = result[i] / 10;
result[i] = result[i] % 10;
}
int whole_len = len1 + len2 - 1;
while(whole_len >= 0) //将后面的0清除掉
{
if(result[whole_len] != 0)
break;
whole_len--;
}
reverseOrder(result, 0, whole_len);
for(int i = 0; i <= whole_len; i++)
cout << result[i];
cout << endl;
return ;
}
void multiply(const char* a, const char* b)
{
int i, j, ca, cb, *s;
ca=strlen(a);
cb=strlen(b);
s=(int *)malloc(sizeof(int)*(ca+cb));
for(i=0; i<ca+cb; i++)
s[i]=0;
for(i=0; i<ca; i++)//a[i]*b[j]的乘积存放在s[i+j+1]中
for(j=0; j<cb; j++)
s[i+j+1]+=(a[i]-'0')*(b[j]-'0');
for(i=ca+cb-1; i>=0; i--)//处理进位
if(s[i]>=10)
{
s[i-1]+=s[i]/10;
s[i]%=10;
}
char *c=(char *)malloc((ca+cb)*sizeof(char));
i=0;
while(s[i]==0)//去除前导0
i++;
for(j=0; i<ca+cb; i++, j++)
c[j]=s[i]+'0';
for(i=0; i<j ;i++)
cout<<c[i];
cout<<endl;
free(s);
free(c);
}
int main()
{
char p1[]="122222222222222";
char p2[]="122222222222222";
multiply(p1, p2);
multiply2(p1, p2);
return 0;
}
分析:
利用字符串处理,并且分析乘法中的特有属性,模拟乘法过程。