//其實這裡直接是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]//兩個字串相加
//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;
== '-')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個指...