面試100題系列之13大數的四則運算

2021-06-14 02:12:41 字數 2572 閱讀 3096

//兩個字串相加

//str1和str2是加數,ans是結果陣列,nmaxlen是結果陣列的最大空間

char* add(char* const str1, char* const str2, char *ans, int nmaxlen)

else if(str1[0] == '-')//一正一負

else if(str2[0] == '-')

int nlen1 = strlen(str1);

if(nmaxlen < nlen1)

return null;

int nlen2 = strlen(str2);

if(nmaxlen < nlen2)

return null;

int i,j,k;

int a,b,carry;

carry = 0;

//加公共部分

for(i = nlen1 - 1, j = nlen2 - 1, k = 0;

(i >= 0 && j >= 0 && k < nmaxlen); --i,--j,++k)

//加str1的多餘部分

for( ; (i >= 0 && k < nmaxlen); --i, ++k)

//加str2的多餘部分

for( ; (j >= 0 && k < nmaxlen); --j, ++k)

if(carry > 0 && k < nmaxlen)

ans[k++] = carry + '0';

//結果的越界檢查

if(k >= nmaxlen)

return null;

//加上結束標記

ans[k] = '\0';

invert(ans, k);

return ans;

}//兩個大數相減

//str1-str2,ans表示結果,nmaxlen表示ans的最大長度

char* minus(char* const str1, char * const str2, char *ans, int nmaxlen)

//保證str1大於str2

int nlen1 = strlen(str1);

if(nmaxlen < nlen1)

return null;

int nlen2 = strlen(str2);

if(nmaxlen < nlen2)

return null;

//其實這裡直接是str1[0]= 0 && j >= 0 && k < nmaxlen); --i,--j,++k)elsecarry = 0;ans[k] = a - b + '0';}//得到str1剩餘的部分for(; (i >= 0 && k < nmaxlen); --i,++k)elsecarry = 0;ans[k] = a + '0';}if(carry > 0 && k < nmaxlen)ans[k++] = '-';if(k >= nmaxlen)return null;ans[k] = '\0';invert(ans, k);return ans;}//大數乘法//str1*str2,ans是結果,nmaxlen是ans的最大容量char *mutiply(char* const str1, char* const str2, char *ans, int nmaxlen)else if(str2[0]

== '-')int nlen1 = strlen(str1);int nlen2 = strlen(str2);if(nmaxlen < nlen1 + nlen2 - 1)//記憶體不夠,返回return null;int *arr = (int *)malloc((nlen1 + nlen2 + 1)*sizeof(int));if(!arr)//記憶體申請失敗,返回return

null;memset(arr, 0, (nlen1 + nlen2 + 1)*sizeof(int));int i,j;for(i = 0; i < nlen1; ++i)}int k,carry;carry = 0;//乘積的結果轉移到ans中for(k = 0, i = nlen1 + nlen2 - 2; i >= 0 && k < nmaxlen;

--i,++k)free(arr);//釋放輔助記憶體arr = null;while(carry > 0 && k < nmaxlen)//檢查是否溢位if(k > nmaxlen)return null;ans[k] = '\0';invert(ans, k);return ans;}

照舊,給出輔助函式和變數定義,以及main函式的呼叫,不需要者可以pass~~~~

#include#include#includechar* add(char* const str1, char* const str2, char *ans, int nmaxlen);

char* minus(char* const str1, char * const str2, char *ans, int nmaxlen);

//反轉字串

void invert(char *str, int nlen)

}int main()

return 0;

}

面試100題系列之18鍊錶合併

碼字也不容易是不?1 給定兩個有序的鍊錶,假設都是 公升序的。需要合併兩個鍊錶,去除重複的元素,也就是求兩個鍊錶的並,這裡要求合併之後的 結果降序排列。既然有序,那問題就簡單多了。ok,輕鬆加愉快的寫出來 遍歷兩個鍊錶,如果鍊錶1的元素比鍊錶2的元素小,取鍊錶1的元素 如果大於,則取鍊錶2的元素 如...

面試100題系列之10關於刪除多餘空格的再思考

題目描述 1 無連續相鄰的兩個空格 2 字串開頭和結尾無空格 3 新的一行開頭和結尾無空格 要得滿分,必須滿足一下兩個條件 a 不能增加新的記憶體空間 b 只能迴圈字串一次 c 不准用庫函式 參考 這樣就可以從檔案中讀入換行符了 include 寫刪除字串中的空格的程式 void main i fr...

從零單排之微軟面試100題系列 08之反轉鍊錶

本題目選自july大神部落格系列 微軟面試100題 july大神,該系列我主要用來記錄我的學習筆記。題目描述 使用遞迴和不遞迴兩種方法反轉鍊錶。本題亦見於 劍指offer 面試題16 遞迴方法 node reverse node phead 非遞迴方法 因在迭代過程中,鍊錶會出現斷裂,因此需要3個指...