高精度加減乘除

2021-08-11 07:41:37 字數 2598 閱讀 6164

一。高精度乘法(敲了好久。。頭禿)

//str1,str2是存數字的字串,返回最後的位數,c儲存結果

int highmult( char str1, char str2, int c )

, b[len2 + 1] = ;

int i, j;

memset(a, 0, sizeof(a));

memset(b, 0, sizeof(b));

memset(c, 0, sizeof(c));

/*
*用這個函式寫1000階乘時這句話沒用了,
*不知道為啥,可把我無奈壞了,找了半天錯,
*好像memset對int陣列不好用,有時候出問題
*/
//把字元變成數字,方便運算

for( i = len1 - 1, j = 0; i >= 0; i--)

a[j++] = str1[i] - '0';

for( i = len2 - 1, j = 0; i >= 0; i--)

b[j++] = str2[i] - '0';

for( i = 0; i < len1; i++)//i, j是權重,i+j就是c裡面的權重

for( j = 0; j < len2; j++)

}

//找位數。。。這個大概可以在前面的**裡優化,,懶,,

for( i = len1 + len2 + 2; (c[i] == 0) && (i >= 0); i-- )

;return i + 1;

}

二。高精度加法

恩!原創棒棒的!

//加起來存進c
int highadd( char num1, char num2, int c )

c[lenc] = x;

if( c[lenc] == 0 )

lenc--;

return lenc;

}

三。高精度減法

//賊他媽難寫,
int highsub( char a, char b, int c )

else if( com < 0)

else

return 1;//一位以便於輸出0

if(sign == 1)}}

else//一樣的}}

for(int i = m - 1; i >= 0; --i)//處理退位時產生的負數問題

if( c[i] < 0 )

if(c[0] == 0)//處理a, b中前幾位相同以至於c前幾位是0的問題

for(int i = 1; i < maxlen; ++i)

if( c[i] != 0 )

c[0] *= sign;

return m;

}

四。高精度除法

這個**對於大數不能算位數相差超過六位的,太慢了,因為是用減法實現的,迴圈減,減了幾次答案就是幾

(最難寫的高精度。。)

//要存小數點就用字元陣列c了,n是確定小數點後幾位,預設c裡面都是0,懶得加memset
int highdiv( char a, char b, char c, int n )

if(c[0] >= 10)//進到頭了就把c整體往後挪一位}}

zs = j + 2;//實際上是指向了小數點後一位

//把減的比b小的a膨脹開來,新增n + 1個0,模擬手算的加0過程

for(int i = strlen(a); i < maxlen && k <= n; ++i, ++k)

j += 2;//j指向第乙個小數字,再來一波和上面差不多的操作

while( compare( a, b ) >= 0 )

if(c[zs] >= 10)}}

k = j;

if( c[k] >= 5 )//四捨五入,迴圈是怕一入就出現了10

dowhile( c[--k] >= 10 );

j = zs + n;

for(int i = 0; i <= j; ++i)//數字變字元,便於小數點列印

c[i] += '0';

c[zs - 1] = '.';

c[j] = '\0';

return j + 1;

}

最後把compare也貼出來吧,不複雜

int compare(char a, char b)

還是初學者,自己敲可能有bug,也應該還可以優化,比如處理進製寫成函式什麼的。

要是以後變大佬了就回來優化一波演算法。

高精度演算法,加減乘除

高精度演算法的兩個基本問題 高精度數的表示和高精度數的基本運算 1.高精度數的表示 首先我想到的是do while 迴圈逆序存放在陣列之中,但書中用string接受並且將其轉化成數字,存放在陣列之中 int arr 100 string str cin str int len str.length ...

高精度加減乘除模板

include include include using namespace std const int power 1 每次運算的位數為10的power次方,在這裡定義為了方便程式實現 const int base 10 10的power次方。要壓位的時候,只需改power 和 base即可,如...

高精度演算法(加減乘除)

最近開始學習解決大數問題,在這裡記錄下自己的學習情況。問題描述 我有乙個非常簡單的問題。給定兩個整數a和b,你的工作是計算a b的和。輸入 輸入的第一行包含整數t 1 t 20 表示測試用例的數量。然後是t行,每行包含兩個正整數,a和b.請注意,整數非常大,這意味著您不應該使用32位整數來處理它們。...