字串 大數的乘法(包括浮點數)

2021-07-01 23:35:56 字數 3185 閱讀 7219

一.大數乘法

我們知道,要運算兩個數的乘法,c、c++語言裡有專門的運算子*。但是當兩個數超過一定的範圍時,用普通的運算子會產生溢位,並不能得到正確的結果。如何進行運算呢?

首先,要想儲存乙個大數,用正常的整形或浮點型別是不夠的。所以我們可以採用字串的形式對大數進行儲存,然後編寫演算法,模擬乘法運算過程即可。

1.第乙個問題:兩個數字運算結果至多用多少位的字串儲存呢?

兩個4位數相乘,最大值為9999*9999它的位數小於10000*10000的位數9位,所以兩個數字相乘的結果至多不超過兩數字數的和

2.第二個問題:運算的過程怎麼模擬?

比如:我們可以先進行類乘和累加,把結果儲存到相應的字元裡,然後進行進製

1  2  3  4

1  2  3

--------------------

3  6   9  12             //一次類乘

2  4   6   8

1 2  3  4

--------------------------

1 4 10 16 17 12             //累加

1 5   1   7   8    2            //進製

但是,這裡會出現的問題就是,如果當兩個數的位數特別大是,先進行類乘累加,由於無符號字元能儲存的最大值也只有255,後進行進製處理時,有可能字元儲存的值已經溢位。所以,在進行處理時要一次類乘後進行進製,然後累加。

處理完思路後,編寫**會變得很輕鬆。

void bignum(char *num1, char *num2)

int count = 0;

while (res[count] == 0) //由於儲存的結果是從右向左的,所以要消除左部分的0;

char* ret = (char *)malloc(sizeof(char)*(length1 + length2 + 2));

memset(ret, 0, sizeof(char)*(length1 + length2 + 2));

for (l = 0, i = count; i < length1 + length2; l++, i++) //非0部分賦給ret

printf("ret=%s\n", ret);

free(res);

free(ret);

}

結果如圖:

二:實現浮點數。實現浮點數相乘,其實和整數差不多。只不過先得把浮點數轉化為整數,並記錄兩個數小數點的位數和,然後再得到的整數上加上相應的小數點即可

void bignum_float(char *str1, char *str2)

; char num2[500] = ;

int i, l;

for (i=0,l=0; l < length1;i++,l++)

if (flnum!=-1) flnum++; //統計小數點後的位數,由於會多加一次,所以初始值為-1

num1[i] = str1[l]; //儲存到新的陣列裡

} for (i = 0,l = 0; l < length2; i++, l++)

if (flnum2!=-1) flnum2++;

num2[i] = str2[l];

} if (flnum!=-1) length1 -= 1; //如果數字存在小數點,則轉化為整數後對應的長度-1

if (flnum2!=-1) length2 -= 1;

flnum = flnum + flnum2;

char *res = (char *)malloc(sizeof(char)*(length1 + length2));

memset(res, 0, sizeof(char)*(length1 + length2));

for (i = length1-1; i>=0;i--)

for (l=length2-1; l >= 0; l--)

int count = 0;

while (res[count] == 0)

char* ret =(char *)malloc(sizeof(char)*(length1 + length2+2));

memset(ret, 0, sizeof(char)*(length1 + length2 + 2));

for (int n=0,l = 0,i=count; i < length1 + length2; l++, i++,n++)

ret[l] = res[i] + '0';

} printf("ret=%s\n",ret);

free(res);

free(ret);

}

結果:

整數(浮點數)轉字串

在實際專案中,我們不可避免的遇到需要將整數 浮點數 轉換為字串輸出 儲存為檔案或者顯示列印 這是乙個很常見的演算法,標準c庫甚至提供了諸如itoa,ltoa,之類的函式供大家呼叫。但是,在一些特殊場合,比如對功耗要求比較苛刻的場合,則對轉換速度提出了要求。在微控制器應用中,很多mcu沒有除法器,和除...

浮點數轉化為字串

1 在不呼叫庫函式的情況下,把浮點數轉化為字串的難點就在,把小數轉化為字串。因為浮點數的精度問題,當我們對浮點數進行乘10操作的時候,浮點數尾數數值可能就會發生變化,如float a 12.1047 a 10 輸出a 121.046997。所以在把浮點數的小數轉化為字串時要對精度進行限制。1 inc...

Python 字串 整數 浮點數

幾個函式 str 將乙個整數或者浮點數變成字串 int 將乙個浮點數或乙個字串變成整數 float 將乙個整數或者字串變成乙個浮點型資料 整數的運算永遠是精確的,而浮點數的運算可能會有四捨五入的誤差 len 可以獲取字串的個數,整數和浮點數沒有這函式 type 可以檢視乙個資料或者變數的型別 有有兩...