目录
字符串相加
字符串相乘
二进制求和
千位分隔数
我们知道无论任何类型都有数字的最大范围,所以我们如果想要对于任何两个数都能够进行
四则运算,那么我们就可以运用一个字符串进行运算
字符串相加
字符串相加
给定两个字符串形式的非负整数 num1
和num2
,计算它们的和并同样以字符串形式返回。
你不能使用任何內建的用于处理大整数的库(比如 BigInteger
), 也不能直接将输入的字符串转换为整数形式。
示例 1:
输入:num1 = “11”, num2 = “123”
输出:“134”
示例 2:
输入:num1 = “456”, num2 = “77”
输出:“533”
示例 3:
输入:num1 = “0”, num2 = “0”
输出:“0”
我们想要对字符串进行运算,所以我们要对字符串进行反转
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| char *reverse(char * s) { int len=strlen(s); int i=0; for(i=0;i<len/2;i++) { char c=s[i]; s[i]=s[len-1-i]; s[len-1-i]=c; } return s; } char * addStrings(char * num1, char * num2) { int i,n1,n2,now,cap; cap=0; int len1=strlen(num1); int len2=strlen(num2); reverse(num1); reverse(num2); int max=len1>len2?len1:len2; char *c=(char *)malloc(sizeof(char)*(max+2)); for(i=0;i<max;i++) { n1=i<len1?num1[i]-'0':0; n2=i<len2?num2[i]-'0':0; int now=n1+n2+cap; cap=now/10; c[i]=(now%10)+'0';
} if(cap) { c[i]='1'; max++; } c[max]='\0'; reverse(c); return c; }
|
字符串相乘
给定两个以字符串形式表示的非负整数 num1
和 num2
,返回 num1
和 num2
的乘积,它们的乘积也表示为字符串形式。
示例 1:
输入: num1 = “2”, num2 = “3”
输出: “6”
示例 2:
输入: num1 = “123”, num2 = “456”
输出: “56088”
说明:
num1
和 num2
的长度小于110。
num1
和 num2
只包含数字 0-9
。
num1
和 num2
均不以零开头,除非是数字 0 本身。
- 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| char *reverse(char *s) { int len=strlen(s); for(int i=0;i<len/2;i++) { char tmp=s[i]; s[i]=s[len-1-i]; s[len-1-i]=tmp; } return s; }
char * multiply(char * num1, char * num2){ int i,j; int len1=strlen(num1); int len2=strlen(num2); int len=len1+len2; int *mul=(int *)malloc(sizeof(int)*(len+5)); char*ret=(char*)malloc(sizeof(char)*(len+5)); memset(mul,0,sizeof(int)*(len+5)); reverse(num1); reverse(num2); for(i=0;i<len1;i++) { for(j=0;j<len2;j++) { mul[i+j]+=(num1[i]-'0')*(num2[j]-'0'); } } for(i=0;i<len;i++) { mul[i+1]+=mul[i]/10; mul[i]%=10; }
while(len>1&&mul[len-1]==0) { len--; }
for(i=0;i<len;i++) { ret[i]=mul[i]+'0'; } ret[len]='\0'; reverse(ret); return ret; }
|
二进制求和
二进制求和
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1
和 0
。
示例 1:
输入: a = “11”, b = “1”
输出: “100”
示例 2:
输入: a = “1010”, b = “1011”
输出: “10101”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| char *reverse(char *s) { int len=strlen(s); for(int i=0;i<len/2;i++) { char tmp=s[i]; s[i]=s[len-1-i]; s[len-1-i]=tmp; } return s; } char * addBinary(char * a, char * b) { int lena=strlen(a); int lenb=strlen(b); int maxlen=lena>lenb?lena:lenb; reverse(a); reverse(b); char *ret=(char*)malloc(sizeof(char)*(maxlen+2)); int av,bv,now,cap=0; int i=0; for(i=0;i<maxlen;i++) { av=(i<lena)?(a[i]-'0'):0; bv=(i<lenb)?(b[i]-'0'):0; now=av+bv+cap; cap=now/2; ret[i]=now%2+'0'; } if(cap) { ret[i]='1'; maxlen++; } ret[maxlen]='\0'; reverse(ret); return ret;
}
|
千位分隔数
千位分隔数
给你一个整数 n
,请你每隔三位添加点(即 “.” 符号)作为千位分隔符,并将结果以字符串格式返回。
示例 1:
输入:n = 987
输出:“987”
示例 2:
输入:n = 1234
输出:“1.234”
示例 3:
输入:n = 123456789
输出:“123.456.789”
示例 4:
输入:n = 0
输出:“0”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| char * reverse(char*n) {
int len=strlen(n); for(int i=0;i<len/2;i++) { char tmp=n[i]; n[i]=n[len-1-i]; n[len-1-i]=tmp; }
return n;
} char * thousandSeparator(int n){ ,要对这个点进行处理 int x=n; if(n==0) { return "0"; } else { int len=0; while(n) { n/=10; len++; } int i=0; char*num=(char*)malloc(sizeof(char)*(len+(len-1)/3+4)); for(i=0;i<len;i++) { if(x) { num[i]=x%10+'0'; x/=10; } } num[i]='\0'; int k=0; for(i=0;i<len-k;i++) { if(i>1&&i%3==0) { int end=len; while(end>=i+k) { num[end+1]=num[end]; end--; } len++; num[i+k]='.'; k++; } } reverse(num); return num; }
}
|