1、解題思路
假如輸入的是兩個整數,則計算乘積可以算術演算。為轉化成算術演算,這裡要解決幾個問題:
1)輸入字串轉成整數處理;
2)按兩數相乘規則,計算中間結果,由於乘數最大為110位,中間結果可能不能用一般整數表示,得解決儲存問題,
3)中間結果求和得到兩數乘積,乘積轉換成字串;
2、有效題解
#define max_row_num 110
#define max_col_num 12101
char* multiply(char* num1, char* num2)
char resarr[max_row_num][max_col_num] = };
memset(resarr, '0', sizeof(resarr));
char *pnum1 = num1;
char *pnum2 = num2;
while (*(pnum1 + 1) != '\0') ++pnum1;
while (*(pnum2 + 1) != '\0') ++pnum2;
char *pnum2end = pnum2;
int resindex = 0;
int endbegin = max_col_num - 1;
while (pnum1 >= num1)
while(base > 0)
while (arrend >= 0) resarr[resindex][arrend--] = '0';
resindex++;
endbegin--;
pnum1--;
}int basecolsum = 0;
int j = max_col_num - 1;
for (; j > 0; j--)
resarr[0][j] = basecolsum % 10 + '0';
basecolsum = basecolsum / 10;
}char *result = (char *)malloc(max_col_num+1);
int resat = 0;
j = 0;
while (j < max_col_num && resarr[0][j] == '0') j++;
if (j == max_col_num)
else
result[resat] = '\0';
return result;
}
3、複雜度分析
4、小結
題目思路簡單,但是想當然的 犯的幾個錯誤:
1)二維陣列初始化不規範;
2)字元轉成整數計算時直接用了強轉,而不是通過+/- 字元』0』;
3)二維陣列未全初始化『0』,後續計算卻是基於這一假設的;
4)while條件裡變數++/--,在執行後判讀後立即執行,而不是表示式執行完後,與需要的值不符;
5)邊界條件0*0 未做處理,while (resarr[0][j] == '0') j++;未對j臨界值做處理;
另外,該實現方式,耗時較長,占用空間較多,應思考再優化。
每日一題 LeetCode
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...
LeetCode每日一題(題1028)
最近在刷leetcode每日一題,每次做完之後總能有些收穫,所以想著不如每天寫個部落格記錄一下做的題目的解法以及自己寫的時候問題出在 從先序遍歷還原二叉樹 題目大意 給出乙個字串 1 2 3 4 5 6 7 1代表節點的值,前面的 個數代表節點的深度。如果只有乙個子節點,保證這個節點為左子節點。返回...
LeetCode每日一題(題139)
題目 題目大意 給出乙個字串s和乙個字串陣列words,判斷s是否能夠拆分成多個words中的字串。分析 這道題比較簡單的方式應該是採用動態規劃來做。對於任意乙個字串中的區間,可以判斷該區間組成的字串是否在字典中,如果是,則這個區間的真假取決於前面那個區間的真假。給出狀態轉移方程dp i dp j ...