能否帮忙找一下逻辑错误,我有点崩,牛客网上那个第四组案例真有那么大的数啊。
char* resolve(char arr[])//倒转字符串的函数
{
int r = strlen(arr) - 1;
int l = 0;
while (l < r)
{
char mid = arr[l];
arr[l] = arr[r];
arr[r] = mid;
l++;
r--;
}
return arr;
}
void restr(char* t, char* s,int tr,int sr)//t right,s right
{
//t比s长才执行这个函数
int i = 0;
for (i = 0; i <= tr; i++)
{
char mid = t[i];
t[i] = s[i];
s[i] = mid;
}
}
char* solve(char* s, char* t)//大数相加函数
{
// write code here
char p[100001] = { 0 };
int slen = strlen(s);//计算长度,方便对位计算(个位加个位,十位加十位)
int tlen = strlen(t);
//谁长以谁为准来确定位,但就让长的变成slen,s
if (tlen >slen)
{
restr(t, s,tlen - 1,slen - 1);
int mid = slen;
slen = tlen;
tlen = mid;
}
int i = 0;
int n = 0;//用来存储进位产生的1,但初始时肯定是0没有进1的
for (i = 0; i < slen + 1; i++)
{
if (i < tlen)
{
if (*(s + slen - i - 1) + *(t + tlen - i - 1) + n - 2 * '0' < 10)//未产生进位
{
p[i] = *(s + slen - i - 1) + *(t + tlen - i - 1) + n - '0';
n = 0;
}
else //产生进位
{
int sum = *(s + slen - i - 1) + *(t + tlen - i - 1) + n - 2 * '0';//这是一个二位数了
p[i] = sum - 10 + '0';
n = 1;
}
}
else if (i < slen)//这时下标越过短的数字了,就完全在长数字里
{
if (n == 1)//在与短数字最高位运算后,是否进1
{
int mid = *(s + slen - i - 1) + n - '0';
if (mid < 10)//进1后是否能又进1
{
p[i] = mid + '0';
n = 0;
}
else
{
p[i] = mid - 10 + '0';
}
}
else
{
p[i] = *(s + slen - i - 1);
}
}
else
{
if (n)//如果在长数字最高位运算后仍进1
{
p[i] = '1';
}
}
}
return resolve(p);//返回字符串时还应注意将字符串颠倒一下
}
int main()
{
char arr1[100000] = { 0 };//整数1
char arr2[100000] = { 0 };//整数2
scanf("%s", arr1);
scanf("%s", arr2);
printf("%s\n", solve(arr1, arr2));
return 0;
}