C中大整数加法中的进位/填充
我试图添加两个大整数,由用户作为字符串输入。当两个输入字符串的长度不同时,我尝试用零填充较短的数字,但没有效果。如果我输入456和7,它会给出3,前面有一些随机字符。 谢谢你的建议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];
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);
}