每周一道算法題(三十四)

本周題目難度‘Medium',使用語言'C'

題目:本次的題目挺有意思的,就是給你兩個(gè)低于110位的數(shù)(以字符串形式給你),讓你求積后以字符串形式返回結(jié)果。

思路:這個(gè)題的思路很簡(jiǎn)單,就是實(shí)現(xiàn)起來會(huì)有很多坑。方法有很多種,我的思路是將兩個(gè)數(shù)的每一位相乘,然后求和,最后處理下數(shù)位的問題即可,當(dāng)然之間涉及到很多類型轉(zhuǎn)換的問題。具體的還是看代碼吧:

char* multiply(char* num1, char* num2) {
    //確定長度
    int len1 = strlen(num1);
    int len2 = strlen(num2);
    //如果有一個(gè)是0,直接返回0
    if (len1 == 1 && num1[0] == '0') return "0";
    if (len2 == 1 && num2[0] == '0') return "0";
    //創(chuàng)建容器并初始化
    char* result = malloc(sizeof(char) * (len1 + len2 + 1));
    for (int i = 0; i < (len1+len2); i++) {
        result[i] = '0';
    }
    result[(len1+len2)] = '\0';
    
    for (int i = 0; i < len1; i++) {
        for (int j = 0; j < len2; j++) {
            //用num1的每一位去乘以num2
            int tempNum = (num1[i] - '0') * (num2[j] - '0');   
            //確定是第幾位
            int index =  i + j + 1;
            //求和
            int lowCount = (result[index] - '0') + (tempNum % 10);
            result[index] = lowCount % 10 + '0'; 
            //是否需要進(jìn)位
            if (lowCount > 9 || tempNum > 9) {  
                int temp = tempNum > 9 ? (result[index - 1] - '0') + (tempNum / 10) : (result[index-1] - '0');
                lowCount = lowCount > 9 ? temp + 1 : temp;
                result[index-1] = lowCount % 10 + '0';
                int addOne = 2;
                //大于10就循環(huán)進(jìn)位
                while (lowCount > 9) {
                    lowCount = (result[index-addOne] - '0') + 1;
                    result[index - addOne] = (lowCount % 10 + '0');
                    addOne++;
                }
            }
        }
    }
    //位數(shù)處理
    if (result[0] == '0') {
        for (int i = 0; i < (len1+len2); i++) {
            result[i] = result[i+1];
        }
    }
    //返回結(jié)果
    return result;
}

效率一般,還有的思路是8位數(shù)8位數(shù)相乘,這樣并不會(huì)越界,可以提高效率,有興趣的小伙伴也可以嘗試一下。

版權(quán)聲明:本文為 Crazy Steven 原創(chuàng)出品,歡迎轉(zhuǎn)載,轉(zhuǎn)載時(shí)請(qǐng)注明出處!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這次的算法題寫的比較low,效率非常低,不過和我一起做這個(gè)算法題的小伙伴們用的暴搜沒通過所有的測(cè)試,這我還是比較欣...
    CrazySteven閱讀 691評(píng)論 2 1
  • 本周的算法題難度級(jí)別依舊是'Easy',也很簡(jiǎn)單 題目:找出所有字符串中最長的公共前綴 思路:提供兩個(gè)思路,一個(gè)思...
    CrazySteven閱讀 712評(píng)論 0 3
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,836評(píng)論 25 709
  • 本周題目的難度是‘EASY'所以為了追求效率,著實(shí)也是搞了好幾天,下面就來分享一下搞這題的心路歷程。。。 題目:判...
    CrazySteven閱讀 913評(píng)論 3 8
  • 今天是周四又到了我們一周一次的美育特色課。 打了下課鈴我們就回到教室了,我收拾好書包,拿著籃球就沖向操...
    楊浩然五年級(jí)三班閱讀 218評(píng)論 0 0

友情鏈接更多精彩內(nèi)容