高精度乘法運算1

2021-05-11 11:31:25 字數 4387 閱讀 2924

#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...