读书人

acm 1002题 提醒 Runtime Error (ACCE

发布时间: 2013-04-20 19:43:01 作者: rapoo

acm 1002题 提示 Runtime Error (ACCESS_VIOLATION) 代码如下。vc++6.0下正常,acm新手求破!!
本帖最后由 wangzhen199009 于 2013-04-10 21:21:54 编辑 //acm 1002 http://acm.hdu.edu.cn/showproblem.php?pid=1002


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* BigIntegerAdd(char *s1,int n1,char *s2,int n2)
{
char *result,*p1,*p2;
int c1=n1,c2=n2,length=n1>n2?n1:n2,carry=0;

p1=s1;
p2=s2;
result=(char *)malloc((length+1)*sizeof(char));

//make p1,p2,result point to tail
p1=s1+n1-1;
p2=s2+n2-1;
result+=length;
*(result+1)=0;//mark the end of string
while (p1>=s1 && p2>=s2)
{
if(*p1+*p2+carry-48>57)//有进位
{
*result=*p1+*p2+carry-10-48;
carry=1;
}
else
{
*result=*p1+*p2+carry-48;
carry=0;
}
p1--;
p2--;
result--;
}

//剩余一串的处理
if (p1<s1)
{
while (p2>=s2)
{
if (*p2+carry>57)
{
*result=*p2+carry-10;
carry=1;
}
else
{
*result=*p2+carry;
carry=0;
}
p2--;
result--;
}
}
else
{
while (p1>=s1)
{
if (*p1+carry>57)
{
*result=*p1+carry-10;
carry=1;
}
else
{
*result=*p1+carry;
carry=0;
}
p1--;
result--;
}
}
//最高位是否有进位
if (carry==1)
{
*result=carry+48;
}
else
{
result++;
}
//puts(result);
return result;
}
void main()
{

int n,i=1;
char *s1=(char*)malloc(sizeof(char)*1000);
char *s2=(char*)malloc(sizeof(char)*1000);
scanf("%d",&n);
getchar();
while (i<=n)
{
scanf("%s",s1);
scanf("%s",s2);
if (i==n)
{
printf("Case %d:\n%s + %s = %s\n",i,s1,s2,BigIntegerAdd(s1,strlen(s1),s2,strlen(s2)));
}
else
{
printf("Case %d:\n%s + %s = %s\n\n",i,s1,s2,BigIntegerAdd(s1,strlen(s1),s2,strlen(s2)));
}

i++;
}
}

ACM C
[解决办法]

result=(char *)malloc((length+1)*sizeof(char));
result+=length;
*(result+1)=0; //越界了吧

读书人网 >C语言

热点推荐