我们知道,计算机能表示的数的范围有限,所以对于一些大数就无法表示,以下程序是模拟手工乘法对两个任意大小数的乘法计算的实现:
#include <iostream>
#include <string>
using namespace std;
int GetDot(char ra[])
{ //取小数点的位置
for (int i = strlen(ra) - 1; i >= 0; i--)
if (ra[i] == '.')
return strlen(ra)-i-1;
return 0;
}
void ReverseTo(char ra[], int a[40])
{ //将ra倒序至a
int len = strlen(ra);
int temp = 0;
for (int i = 0; i < len; i++)
if (ra[len-1-i] != '.')
{
a[temp] = (int)ra[len-1-i]-48;
temp++;
}
else
continue;
for (i = temp; i<40; i++)
a[i] = 0;
}
int result_num,result[100];
void MultByOne(char ra[40], int b, int result_temp[100])
{ //a[]*b
int a[40],aLen;
ReverseTo(ra, a);
if (GetDot(ra))
aLen = strlen(ra)-1;
else aLen = strlen(ra);
int temp,t;
for (int i = 0; i < 100; i++)
result_temp[i] = 0;
for (i = 0; i < aLen; i++)
{
temp = b*a[i];
t = result_temp[i] + temp % 10;
result_temp[i] = t % 10;
result_temp[i+1] = result_temp[i+1] + temp/10+t / 10;
}
if (result_temp[aLen] == 0)
result_num = aLen;
else result_num = aLen + 1;
}
void Mult(char ra[40], char rb[40])
{ //a[]*b[]
int a[40],b[40],bLen;
ReverseTo(ra, a);
ReverseTo(rb, b);
if (GetDot(rb))
bLen = strlen(rb) - 1;
else bLen = strlen(rb);
int temp[100];
for (int i = 0; i < bLen; i++)
{
MultByOne(ra, b[i], temp);
for (int j = 0; j < result_num; j++)
{
result[i+j] = result[i+j] + temp[j];
if (result[i+j] >= 10)
{
result[i+j] = result[i+j] % 10;
result[i+j+1] = result[i+j+1] + 1;
}
}
}
}
int ResultLen(char ra[40], char rb[40])
{ //结果长度
int a[40],b[40],aLen,bLen;
ReverseTo(ra,a);
ReverseTo(rb,b);
if (GetDot(ra))
aLen = strlen(ra)-1;
else aLen = strlen(ra);
if (GetDot(rb))
bLen = strlen(rb)-1;
else bLen = strlen(rb);
if (result[aLen+bLen-1] == 0)
return result_num =aLen + bLen - 1;
else if (result[aLen+bLen] == 0)
return result_num = aLen + bLen;
else return result_num = aLen + bLen + 1;
}
void main()
{
char a[] = "0.36534";
char b[] = "6343434.534347";
Mult(a,b);
int dot = GetDot(a) + GetDot(b);
for (int i = 0; i < ResultLen(a,b); i++)
{
cout<<result[ResultLen(a,b)-1-i];
if (ResultLen(a,b)-1-i == dot)
cout<<'.';
}
cout<<endl;
}