c语言如何实现多对大数相加?

#include<stdio.h>
#include<string.h>

int main()
{
char a[100],b[100];
int i,j,k,aa,bb,temp;
int c[100];
memset(a,0,sizeof(a));//memset将地址a开始的sizeof(a)字节置0;
memset(b,0,sizeof(b));
scanf("%s",a);
scanf("%s",b);
i=strlen(a);i--;
j=strlen(b);j--;
k=0;
temp=0;
while(i>=0&&j>=0)
{
aa=a[i]-'0';
bb=b[j]-'0';
temp+=aa+bb;
c[k]=temp%10;
temp=temp/10;
i--;j--;k++;
}
while(i>=0)
{
aa=a[i]-'0';
temp+=aa;
c[k]=temp%10;
temp=temp/10;
i--;k++;

}
while(j>=0)
{
bb=b[j]-'0';
temp+=bb;
c[k]=temp%10;
temp=temp/10;
j--;k++;
}
for(i=k-1;i>=0;i--)
printf("%d",c[i]);
main();
return 0;
}

思路:

1.输入xxxx+xxxxxx,已‘+’分割成两个子串。

2.逆序两个子串,末位变成首位对齐,按位相加,大于10则向后位进一。

3.需要考虑到两个数长度不同的情况。

4.再把最后的结果逆序输出,就得到了最终正向相加的结果。

思路实现代码如下(在vc6.0中编译通过):

#include <stdio.h>
#include <string.h>
void reverse(char *s,int len);
char * addLargeNumber(char *s1,char *s2);
int main(int argc, char const *argv[])
{
char str[100];
int len[10];//截取的每个子串的长度
scanf("%s",str);
char *sep = "+-*/";
char *p = strtok(str,sep);
char *s = p;
char *k = p;
len[0] = strlen(p);
reverse(p, len[0]);
puts(p);
while(1)
{
s = strtok(NULL, sep);
if (s == NULL)
{
break;
}
len[1] = strlen(s);
reverse(s,len[1]);
puts(s);
k = s;//
}
printf("access to addLargeNumber\n");
p = addLargeNumber(p,k);
len[2] = strlen(p);
reverse(p,len[2]);
puts(p);
return 0;
}
//反转一个字符串
void reverse(char *s,int len)
{
char temp;
 int i;
 for(i = 0;i<len/2;i++)
 {
 temp = s[i];
 s[i] = s[len-1-i];
 s[len-1-i] = temp;
 }
 
}
//接收两个字符串,把长度小的加到长度大的串上,返回相加后的串
char * addLargeNumber(char *s1,char *s2)
{
char *p = s1;
char *q = s2;
char k;
int i;
printf("子串1的长度=%lu å­ä¸²2的长度=%lu\n", strlen(p),strlen(q));
int len = strlen(q);
//确保p指向长度较长的串。确保len的值为较小的串的长度。 
if (strlen(s1)<strlen(s2))
{
len = strlen(p);
q = s2;
p = s1;
}
int difflen = strlen(p)-strlen(q);//两个子串长度的差值。
//printf("len = %d difflen = %d\n",len ,difflen);
for (i = 0; i <len; ++i)
{
int a = p[i] + q[i] -96;
//printf("a = %d\n", a);
if (a>=10)
{
k = a -10+ 48;
p[i+1] += 1;
}
else 
{
k = a + 48;
}
//printf("k = %c\n", k);
p[i] = k;
printf("p[%d] = %c\n", i,p[i]);
}
//解决较长串后一位如果被进位的情况。例如:1379+128(假设两个已逆序的串)或者15999+148
for(i = 0;i<difflen;i++)
{
if (p[len+i] == 58)
{
p[len+i] -= 10;
if (i == difflen-1)
{//当i指向最后一个有效数字时,并且当前位是‘:’,则将其后一位赋为结束符
p[len+i+1] = 49;//这种是赋值符号,是将'1'赋给p[i]。对比下面的运算符
p[len+difflen+1] = 0;
}
else
{
p[len+i+1] += 1;//这种是运算符,是将p[i]的ASCII码加1.
}
printf("p[%d] = %c\n",len+i,p[len+i] );
}
else
{
break;
}
}
printf("相加之后的串长度= %lu\n", strlen(p));
puts(p);
return p;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-02-25
逆序存放再考虑相加

进位只要判断
if(a[i]-48+b[i]-48>=10)
c=1;
else
c=0;追问

进位的问题已经解决,就是无法解决多对数的问题

追答

外面加个for

解决一对就可以解决多对啊

追问

题目不允许让输入对数

追答

什么意思!

追问

for里面不是要对多组数的结束判断吗?但是题目中没有让输入一共多少组数。

追答

while(scanf("%s%s",a,b) == 2)
{
程序段
}

试试。。

相似回答