C中大整数加法中的进位/填充

C中大整数加法中的进位/填充,c,C,我试图添加两个大整数,由用户作为字符串输入。当两个输入字符串的长度不同时,我尝试用零填充较短的数字,但没有效果。如果我输入456和7,它会给出3,前面有一些随机字符。 谢谢你的建议 void reverse(char *start, char *end) { int l ; int len = strlen(start); for (l=0;l<len;l++) end[l] = start[len-l-1];

我试图添加两个大整数,由用户作为字符串输入。当两个输入字符串的长度不同时,我尝试用零填充较短的数字,但没有效果。如果我输入456和7,它会给出3,前面有一些随机字符。 谢谢你的建议

void reverse(char *start, char *end)
    {
        int l ;
        int len = strlen(start);
        for (l=0;l<len;l++)
            end[l] = start[len-l-1];
        end[len] = '\0'; 

    }

    void add (char *x, char *y, char *sum)
    {
        char XA[MAXDIGITS];
        char YA[MAXDIGITS];
        char tempa[MAXDIGITS];
        int xa_len, ya_len, xa1, ya1, carry, addition, p, q;
        int m = 0;
        int n = -1;
        xa_len=strlen(x);
        ya_len=strlen(y);
        reverse(x,XA);
        reverse(y,YA);
        m = (xa_len > ya_len)?xa_len:ya_len;
        for(xa1=0;xa1<=m;xa1++)
            tempa[xa1] = '0';
        tempa[xa1] = '\0';
        if(xa_len>ya_len)
        {
            for(p=(xa_len-ya_len);p=<m;p++) YA[p]='0';
            YA[p] = '\0';
        }
        if(ya_len>xa_len)
        {
            for(q=(xa_len-ya_len);q=<m;q++) XA[q]='0';
            XA[p] = '\0';
        }
        for(xa1=0;xa1<=m;xa1++)
        {   
            addition=(XA[xa1]-'0')+(YA[xa1]-'0')+carry;
            tempa[xa1] = addition%10+'0';
            carry = addition/10;
            if (n<xa1) n=xa1;                           
        }       
        printf("%d", carry);    
        for(;n>0 && tempa[n]=='0';n--)
        tempa[n+1]='\0';
            reverse(tempa,sum); 
    }
void reverse(字符*开始,字符*结束)
{
int l;
int len=strlen(开始);
对于(l=0;l雅伦)?xa_伦:雅伦;
对于(xa1=0;xa1ya_len)
{
对于(p=(xa_len-ya_len);p=xa_len)
{

对于(q=(xa_len-ya_len);q=当然
进位
必须初始化

跟随代码时遇到问题。对
reverse()
的调用可以通过简单地以相反方向运行循环来完成。此外,最后执行的a执行似乎不会影响结果。建议的代码如下:

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

char *str_add(const char *a, const char *b) {
  size_t alen = a == NULL ? 0 : strlen(a);
  size_t blen = b == NULL ? 0 : strlen(b);
  if (blen > alen) {
    const char *t = a; a = b; b = t;
    size_t tlen = alen; alen = blen; blen = tlen;
  }
  size_t clen = blen + 1;
  int carry = 0;
  char *c = malloc(clen + 1);  // 1 extra
  const char *ap = &a[alen];
  const char *bp = &b[blen];
  char *cp = &c[clen];
  *cp = '\0';
  while (bp > b) {
    int sum = *(--ap) - '0' + *(--bp) - '0' + carry;
    carry = 0;
    if (sum >= 10) {
      sum -= 10;
      carry++;
    }
    *(--cp) = sum + '0';
  }
  while (ap > a) {
    int sum = *(--ap) - '0' + carry;
    carry = 0;
    if (sum >= 10) {
      sum -= 10;
      carry++;
    }
    *(--cp) = sum + '0';
  }
  if (carry) {
    memmove(&cp[1], &cp[0], clen);
    *cp = carry + '0';
  }
  return cp;
}

void test_add(const char *a, const char *b) {
  char *sum = str_add(a,b);
  printf("%s + %s = %s\n", a, b, sum);
  free(sum);
}
#包括
#包括
#包括
字符*str_添加(常量字符*a,常量字符*b){
大小=a==NULL?0:strlen(a);
大小\u t blen=b==NULL?0:strlen(b);
如果(blen>alen){
常量字符*t=a;a=b;b=t;
尺寸=alen;alen=blen;blen=tlen;
}
尺寸\u t clen=blen+1;
整数进位=0;
char*c=malloc(clen+1);//额外1个
常量char*ap=&a[alen];
常量字符*bp=&b[blen];
char*cp=&c[clen];
*cp='\0';
而(bp>b){
整数和=*(-ap)-'0'+*(-bp)-'0'+进位;
进位=0;
如果(总和>=10){
总和-=10;
进位++;
}
*(-cp)=和+0';
}
while(ap>a){
整数和=*(-ap)-“0”+进位;
进位=0;
如果(总和>=10){
总和-=10;
进位++;
}
*(-cp)=和+0';
}
如果(携带){
memmove(cp[1]、&cp[0],clen);
*cp=进位+0';
}
返回cp;
}
无效测试添加(常量字符*a,常量字符*b){
char*sum=str_add(a,b);
printf(“%s+%s=%s\n”,a,b,sum);
免费(金额);
}

我可以看到一些地方您使用了
carry
,但我看不到任何地方您提供了
carry
初始值。我建议您在编译时将警告设置为最大值。在unix上是
-Wall
,在microsoft上是IIRC
-W4
。您可能希望将其用作参考。
#include <malloc.h>
#include <stdio.h>
#include <string.h>

char *str_add(const char *a, const char *b) {
  size_t alen = a == NULL ? 0 : strlen(a);
  size_t blen = b == NULL ? 0 : strlen(b);
  if (blen > alen) {
    const char *t = a; a = b; b = t;
    size_t tlen = alen; alen = blen; blen = tlen;
  }
  size_t clen = blen + 1;
  int carry = 0;
  char *c = malloc(clen + 1);  // 1 extra
  const char *ap = &a[alen];
  const char *bp = &b[blen];
  char *cp = &c[clen];
  *cp = '\0';
  while (bp > b) {
    int sum = *(--ap) - '0' + *(--bp) - '0' + carry;
    carry = 0;
    if (sum >= 10) {
      sum -= 10;
      carry++;
    }
    *(--cp) = sum + '0';
  }
  while (ap > a) {
    int sum = *(--ap) - '0' + carry;
    carry = 0;
    if (sum >= 10) {
      sum -= 10;
      carry++;
    }
    *(--cp) = sum + '0';
  }
  if (carry) {
    memmove(&cp[1], &cp[0], clen);
    *cp = carry + '0';
  }
  return cp;
}

void test_add(const char *a, const char *b) {
  char *sum = str_add(a,b);
  printf("%s + %s = %s\n", a, b, sum);
  free(sum);
}