一.大數乘法
我們知道,要運算兩個數的乘法,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 可以檢視乙個資料或者變數的型別 有有兩...