#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; iif (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; is[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 (decimalelse pos+=2;
s[pos]=0;
p=head->next;
for (i=0;iif (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);
coutint cuttailzero(char *s)
int length, pointi, i;
length=strlen(s);
for (i=0; iif (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; iif (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; iif (s[i]!=' ') s[n++]=s[i];
s[n]=0;
python高精度乘法 高精度運算
今天模擬,很巧的是我前兩天剛看過這個qwq 某人為數不多的寫了blog的題解 我麻了,這個人怎麼會是我 高精度運算需要使用python 因為在十進位制,int最多十位,long long最多十九位,要算比這個還大的數,就要把它拆成一位一位,模擬列豎式計算,也就是高精度 輸入和輸出 chars1 ma...
高精度加減乘法運算
高精度,就是利用陣列存放數字,每個元素存放乙個數字,這樣就可以實現對一些較大的數字進行運算 加法 進製 include include include using namespace std intmain c lenc x if c lenc 0 lenc 處理最高進製 for i lenc i ...
高精度減法,高精度乘法
高精度減法 oj資料偏弱如果新增乙個101 2就錯了,下面這一步是為了防止錯誤的 if a aa 0 可能出現第一位的1被借走的的情況,所以加乙個while找第乙個不是0的 while c i 0 i include include include include include include u...