[解题报告]《算法零基础100讲》(第27讲) 字符串算法(七) - 高精度(2)

简介: [解题报告]《算法零基础100讲》(第27讲) 字符串算法(七) - 高精度


415. 字符串相加


415. 字符串相加

https://leetcode-cn.com/problems/add-strings/


题目描述


给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。


你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。


思路


按照知识点进行计算就好了,我比较喜欢直接while几次,我相信你们能看懂。


void swap(char *a,char *b){
    *a = *a ^ *b;
    *b = *a ^ *b;
    *a = *a ^ *b;
}
void rever(char *s){//反转字符串
    int len = strlen(s);
    for(int i = 0;i < len/2;i++)
        swap(&s[i],&s[len-1-i]);
}
char * addStrings(char * num1, char * num2){
    int size1 = strlen(num1),size2 = strlen(num2),jinwei = 0;
    char *ans = malloc(sizeof(char)*10020);
    int ansSize = 0;
    while(size1&&size2){    //两数相加
        size1--;size2--;
        ans[ansSize++] = (num1[size1] - '0' + num2[size2] -'0' + jinwei) % 10 + '0';
        jinwei = (num1[size1]-'0' + num2[size2]-'0' + jinwei) /10;
    }
    while(size1){   //一还长
        size1--;
        ans[ansSize++] = (num1[size1] - '0' + jinwei)%10 + '0';
        jinwei = (num1[size1] -'0'+ jinwei)/10;
    }
    while(size2){   //二还长
        size2--;
        ans[ansSize++] = (num2[size2] - '0' + jinwei)%10 +'0';
        //printf("%d ",ansSize);
        jinwei = (num2[size2] - '0'+ jinwei)/10;
    }
    while(jinwei){  //进位还有
        ans[ansSize++] = jinwei%10 + '0';
        jinwei/=10;
    }
    ans[ansSize] =0;
    rever(ans);
    return ans;
}

67. 二进制求和


67. 二进制求和

https://leetcode-cn.com/problems/add-binary/


题目描述


给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。


你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。


思路


按照知识点进行计算就好了,不同的就是进位的计算方式,直接看吧。


void swap(char *a,char *b){
    *a = *a ^ *b;
    *b = *a ^ *b;
    *a = *a ^ *b;
}
void rever(char *s){
    int len = strlen(s);
    for(int i = 0;i < len/2;i++)
        swap(&s[i],&s[len - 1 -i]);
}
char * addBinary(char * a, char * b){
    int jinwei = 0,anssize = 0,size1 = strlen(a),size2 = strlen(b) ;
    char *ans = malloc(sizeof(char)*10010);
    while(size1 && size2){
        size1--;size2--;
        ans[anssize++] = (jinwei +a[size1] - '0'+b[size2] - '0')%2 +'0';
        jinwei = (jinwei + a[size1]-'0' +b[size2]-'0')/2; 
    }
    while(size1){
        size1--;
        ans[anssize++] = (jinwei + a[size1]-'0')%2 +'0';
        jinwei = (jinwei +a[size1] - '0')/2;
    }
    while(size2){
        size2--;
        ans[anssize++] = (jinwei +b[size2]-'0')%2 +'0';
        jinwei = (jinwei +b[size2] -'0')/2;
    }
    while(jinwei){
        ans[anssize++] = jinwei%2 +'0';
        jinwei/=2;
    }
    ans[anssize] = 0;
    rever(ans);
    return ans;
}


1880. 检查某单词是否等于两单词之和


1880. 检查某单词是否等于两单词之和

https://leetcode-cn.com/problems/check-if-word-equals-summation-of-two-words/


题目描述


给你三个字符串 firstWord、secondWord 和 targetWord ,每个字符串都由从 'a' 到 'j' (含 'a' 和 'j' )的小写英文字母组成。


如果 firstWord 和 secondWord 的 数值之和 等于 targetWord 的数值,返回 true ;否则,返回 false 。


思路


这个题给的范围是8个,那一个int不就存的下了?那直接转成int加看等不等不就完了?


int tonum(char *s){     //转换为数字方便计算
    int ans = 0;
    for(int i = 0;s[i];i++){
        ans*=10;
        ans += s[i] - 'a';
    }
    return ans;
}
bool isSumEqual(char * firstWord, char * secondWord, char * targetWord){
    return tonum(targetWord) == tonum(firstWord) +tonum(secondWord);
}

43. 字符串相乘


43. 字符串相乘

https://leetcode-cn.com/problems/multiply-strings/


题目描述


给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。


思路


按照知识点进行计算就好了。


void swap(char *a,char *b){
    *a = *a ^ *b;
    *b = *a ^ *b;
    *a = *a ^ *b;
}
int verse(char *s){        //逆序
    int len = strlen(s);
    for(int i = 0;i<len/2;i++)  swap(&s[i],&s[len - 1 - i]);
    return len;
}
char * multiply(char * num1, char * num2){
    int size1 = verse(num1),size2 = verse(num2);//反转字符串 顺带提取长度
    int *ans = malloc(sizeof(int)*(size1 + size2 + 1));
    memset(ans,0,sizeof(int)*(size1+size2+1));
    char *anschar = malloc(sizeof(char)*(size1 + size2 +5));
    for(int i = 0;i < size1;i++)
        for(int j = 0;j < size2;j++)
            ans[i+j] += (num1[i] - '0' )*( num2[j] - '0');
    int jinwei = 0,anssize = size1+size2-1;
    for(int i = 0;i < size1 +size2 - 1;i++){//处理进位
        printf("%d %d",ans[i],jinwei);
        anschar[i] = (jinwei+ans[i])%10 + '0';
        jinwei = (jinwei+ans[i])/10;
    }
    while(jinwei){
        anschar[anssize++] = jinwei%10 +'0';
        jinwei/=10; 
    }
    while(anssize > 1&&anschar[anssize-1] == '0') anssize--;    //处理头部0
    anschar[anssize++] = 0;
    anssize=verse(anschar);
    return anschar;
}


273. 整数转换英文表示


273. 整数转换英文表示

https://leetcode-cn.com/problems/integer-to-english-words/


题目描述


将非负整数 num 转换为其对应的英文表示。


思路


(终于到这题了,哈哈哈),我知识点里只说了一句分治。那这题怎么分治呢?


英语的逗号为啥是三位一个呢?因为他们算是三位是一组。然后读完一组加个单位就好了。跟我们喜欢四位一组一样呀。所以我们就按照这个规律来嘛。


先处理掉三位以内咋读,然后连一起就完事了?


char single[10][10] = {"Zero","One","Two","Three","Four","Five","Six","Seven","Eight","Nine"};
char teens[10][10] = {"Ten","Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","Seventeen","Eighteen","Nineteen"};
char ty[10][10] = {" ","Ten","Twenty","Thirty","Forty","Fifty","Sixty","Seventy","Eighty","Ninety"};
char hundered[4][10] ={"Hundred","Thousand","Million","Billion"};
char *qian(int);//声明有一个函数
char * numberToWords(int num){
    char *ans =malloc(sizeof(char)*200); //每位数字最多两个单词 一个单词5位左右,最多九位估计90个
    ans[0]= 0;
    if(!num){
        strcat(ans,single[0]);//返回0
        return ans;
    }
    for(int i = 3,wei = 1000000000;i>=0;i--,wei/=1000){
            int temp = num/wei;
            if(temp){
                strcat(ans,qian(temp));
                if(i){
                    strcat(ans,ty[0]);//插入空格
                    strcat(ans,hundered[i]);//插入位信息
                    if(num %= wei)  strcat(ans,ty[0]);//插入空格
                }
            }
            num %= wei;
    }
    return ans;
}
char *qian(int num){        //处理三位数
    char *ans = malloc(sizeof(char)*100);//4位最多也就40个吧
    ans[0] = 0;
    if(num/100){
        strcat(ans,single[num/100]);
        strcat(ans,ty[0]);//空格
        strcat(ans,hundered[0]);//百
        num %= 100;
        if(num) strcat(ans,ty[0]);//空格
    }
    if(num/10 > 1){ //teens
        strcat(ans,ty[num/10]);//插入十位
        num %= 10;
        if(num) strcat(ans,ty[0]);
    }
    if(num >=10){
        strcat(ans,teens[num-10]);
        return ans;
    }
    else if(num > 0){
        strcat(ans,single[num]);
        return ans;
    }
    return ans;
}

写在最后


今天题量有点大,有点吃不消了是不存在的。。。哈哈哈哈哈哈  爽  大家加油呀。

相关文章
|
2天前
|
算法
【优选算法】—— 字符串匹配算法
【优选算法】—— 字符串匹配算法
|
1天前
|
算法 安全
死锁相关知识点以及银行家算法(解题详细步骤)
死锁相关知识点以及银行家算法(解题详细步骤)
6 2
|
2天前
|
算法 搜索推荐 程序员
第六十五练 字符串匹配 - Rabin-Karp算法
第六十五练 字符串匹配 - Rabin-Karp算法
5 1
|
2天前
|
算法 搜索推荐 程序员
第六十四练 字符串匹配 - Boyer-Moore算法
第六十四练 字符串匹配 - Boyer-Moore算法
6 0
|
2天前
|
算法 搜索推荐 程序员
第六十三练 字符串匹配 - KMP算法
第六十三练 字符串匹配 - KMP算法
6 2
|
2天前
|
算法 C语言 人工智能
|
2天前
|
算法
代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结
代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结
24 1
|
2天前
|
算法
【算法学习--字符串】(不含KMP算法)
【算法学习--字符串】(不含KMP算法)
|
2天前
|
算法 Java
[Java·算法·简单] LeetCode 28. 找出字符串中第一个匹配项的下标 详细解读
[Java·算法·简单] LeetCode 28. 找出字符串中第一个匹配项的下标 详细解读
26 0
|
2天前
|
算法 测试技术 C++
【字符串】【 LCP】【C++算法】2573找出对应 LCP 矩阵的字符串
【字符串】【 LCP】【C++算法】2573找出对应 LCP 矩阵的字符串