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; }
写在最后
今天题量有点大,有点吃不消了是不存在的。。。哈哈哈哈哈哈 爽 大家加油呀。