#include<string.h>
//翻转
void *reverse(char str[])
{
int len =strlen(str)
char*ps,*pe,tmp
ps=str,pe=str+len-1
for( ps<peps++,pe--)
{
tmp=*ps
*ps=*pe
*pe=tmp//need *
}
return str//dont't forget return str
}
//相加,并ascii码变为相应的数字
void add(char a[],char b[])
{
char *pl,*ps
int i,la,lb,len
la=strlen(a)
lb=strlen(b)
(la>lb)?(pl=a,ps=b,len=lb):(pl=b,ps=a,len=la)
for(i=0 i<len i++)
{
pl[i] += ps[i]-96//96=2*'0'
//don't need *
}
len = (la>lb)?la:lb
for( i<leni++)
{
pl[i] -= 48//don't need *
}
for(i=0 i<len i++)
{
if(pl[i] >9)
{
pl[i+1]++
pl[i] %= 10
}
}
if(pl[len] != 0)
{
printf("%d",pl[len])
}
for(i=len-1 i>=0 i--)
{
printf("%d",pl[i])
}
}
int main()
{
char a[200],b[200]
scanf("%s%s",a,b)
add(reverse(a),reverse(b))
return 0
}
把两个数用数组倒过来存放 比如 567 +789变成765+987
然后两个数组就是
a[]={7,6,5}
b[]={9,8,7}
对应的相加变为c数组
c[] ={7+9,6+8,5+7}
变为 16 14 12
然后看进位16留下6,前面进一位14变为15变为 6 15 12
再看中间15留下5,前面进一位12变为13,变为 6 5 13
再看 13留下3,向前进一位 变为1,那么最后变为6 5 3 1
最后倒过来,结果就是1356
for (i = 0i <Mi++)
{
c1[i] += (a1[i] + b1[i]) % 10
c1[i + 1] += (a1[i] + b1[i]) / 10
}
这是处理进位的代码
效果:
代码:
#include<stdio.h>#include<string.h>
void reverse(char s[]) {
int len = strlen(s), h = len / 2
char temp
for (int i = 0 i < h ++i) {
temp = s[i]
s[i] = s[len - i - 1]
s[len - i - 1] = temp
}
}
#define System 10
#define MAX 24
const char mx = '9'
const char mn = '0'
char* Sum(char s1[], char s2[]) {
char ans[MAX]
int len1 = strlen(s1), len2 = strlen(s2), ad = 0, min = len1 < len2 ? len1 : len2, max = len1>len2 ? len1 : len2, i
char* st1, *st2
if (len1 > len2) { st1 = s2 st2 = s1 }
else { st1 = s1 st2 = s2 }
reverse(st1)
reverse(st2)
for (i = 0 i < min i++) {
ans[i] = st1[i] + st2[i] - '0' + ad
if (ans[i] > mx) {
ans[i] -= System
ad = 1
}
else ad = 0
}
while (ad != 0 || i <max) {
if (i < max)ans[i] = st2[i] + ad
else ans[i] = mn + ad
if (ans[i] > mx) {
ans[i] -= System
ad = 1
}
else ad = 0
i++
}
ans[i] = '\0'
reverse(ans)
return ans
}
int main() {
char A[21], B[21], C[50], *ans
int n, m
scanf("%d %d", &m, &n)
scanf("%s %s", A, B)
ans = Sum(A, B)
strcpy(C, ans)
printf("%s\n", C)
}