#include "iostream.h"
#include "minmax.h"
#include "string.h"
typedef struct Data
{
int digit;
struct Data *next;
} node;
typedef node* pnode;
bool InputData(pnode head);
void PrintData(pnode head);
int StandardChange(char *s);
booll Multiplication(pnode a, pnode b, pnode &head);
int CutTailZero(char *s);
void CutFirstZero(char *s);
void CutAllSpace(char *s);
void main()
{
pnode heada, headb, head;
heada=new node;
if (!heada) return;
headb=new node;
if (!heada)
{
delete heada; return;
}
head=new node;
if (!head)
{
delete heada;
delete headb;
return;
}
cout << "请输出被乘数(正数):";
if (!InputData(heada)) return;
cout<<"请输出乘数(正数):";
if (!InputData(headb)) return;
PrintData(heada);
PrintData(headb);
if (Multiplication(heada, headb, head)) PrintData(head);
}
// 输入信息
bool InputData(pnode head)
{
char s[100];
int i, DecimalNum, length;
pnode p, p1;
cin.getline(s, 1000);
DecimalNum=StandardChange(s);
if (DecimalNum==-1) return false;
length=strlen(s);
p=head;
p->digit=DecimalNum+100*length;
for (i=length-1; i>=0; i--)
{
p1=new node;
if (!p1) return false;
p1->digit=s[i]-48;
p->next=p1;
p=p1;
}
p->next=0;
return true;
}
int StandardChange(char *s)
{
int i, Pointi, length, point;
CutAllSpace(s);
point=false;
length=strlen(s);
for(i=0; i<length; i++)
{
if (s[i]=='.')
{
if (point) break;
point=true;
continue;
}
if (s[i]<'0' || s[i]>'9') break;
}
s[i]=0;
CutFirstZero(s);
point=CutTailzero(s);
length=strlen(s);
PointNum=length-pointi-1;
if (PointNum<0) PointNum=0;
for(i=pointi; i<length; i++)
s[i]=s[i+1];
CutFirstZero(s);
if (!s[0]) return -1;
return PointNum;
}
// 高精度乘法运算(支持:99位小数及总位数2亿位)
bool Multiplication(pnode a, pnode b, pnode &head)
{
pnode pa, pb, p, p1;
int n, nb, xb, x;
pa=a->next;
pb=b->next;
if (!pa || !pb) return false;
n=a->digit/100+b->digit/100;
p=head;
while(n)
{
p1=new node;
p1->digit=0;
p->next=p1;
p=p1;
n--;
}
p->next=NULL;
nb=0;
p1=b->next;
pb=b->next;
while(pb)
{
nb++;
p1=p1->next;
p=p1;
xb=pb->digit;
pa=a->next;
while(pa)
{
x=xb*pa->digit;
p->digit+=x;
p=p->next;
pa=pa->next;
}
pb=head->next;
while(p)
{
x=p->digit;
if (x<9) p->digit=x%10;
p=p->next;
if (x/10) p->digit+=x/10;
}
p=head;
n=0;
while(p->next)
{
if (!p->next->next && !p->next->digit)
{
p->next=NULL;
break;
}
p=p->next;
n++;
}
x=a->digit%100+b->digit%100;
head->digit=100*n+x;
return true;
}
// 输出信息
void PrintData(pnode head)
{
pnode p;
int Decimal, n, pos, i;
char *s;
p=head;
n=p->digit/100;
Decimal=p->digit%100;
s=new char[n+3];
if (!s) return;
pos=max(n, Decimal);
if (Decimal)
if (Decimal<n) pos++;
else pos+=2;
s[pos]=0;
p=head->next;
for (i=0;i<Decimal;i++)
if (p)
{
s[--pos]=p->digit+48;
p=p->next;
}
else s[--pos]='0';
if (Decimal) s[--pos]='.';
while(p)
{
s[--pos]=p->digit+48;
p=p->next;
}
if (Decimal>=n) s[--pos]='0';
CutTailZero(s);
cout<<s<<endl;
}
// 截掉小数点后末尾无效的0, 如12,300
int CutTailZero(char *s)
{
int length, pointi, i;
length=strlen(s);
for (i=0; i<length; i++);
if (s[i]=='.') break;
pointi=i;
for(i=length-1;i>pointi; i--)
if (s[i]!='0' break;
s[i+1]=0;
length=strlen(s);
if (s[length-1]=='.') s[length-1]=0;
return pointi;
}
// 截掉前面无效的0,如0012.3变换成12.3
void CutFirstZero(char *s)
{
int length, start, i;
length=strlen(s);
for (i=0; i<length; i++)
if (s[i]!='0') break;
start=i;
for(i=start; i<=length; i++)
s[i-start]=s[i];
}
// 去掉字符串中的所有空格
void CutAllSpace(char *s)
{
int i, n, length;
n=0;
length=strlen(s);
for(i=0; i<length; i++)
if (s[i]!=' ') s[n++]=s[i];
s[n]=0;
}