看了题解。
调了很久之后,一次AC。
复习了一遍大数加法。
其中有一个很迷的地方。
加 c[i]='\0' 就可以。
void revstr(char s[])
{
int i, j;
for (i = 0, j = strlen(s) - 1; i < j; i++, j--)
{
char c = s[i];
s[i] = s[j];
s[j] = c;
}
}
void add(char a[], char b[], char c[])
{
memset(c, 0, sizeof(c));
int la = strlen(a), lb = strlen(b);
int l = la > lb ? la : lb;
int i;
int bit = 0;
int k;
char p, q;
for (i = 0; i < l; i++)
{
p = a[i] == '\0' ? '0' : a[i];
q = b[i] == '\0' ? '0' : b[i];
k = p - '0' + q - '0' + bit;
bit = k / 10;
c[i] = k % 10 + '0';
}
if (bit)
c[i++] = bit + '0';
c[i] = '\0';
}
bool isOK(char num[], char a[], char b[])
{
char c[1000];
add(a, b, c);
revstr(c);
int l = strlen(c);
char t[1000];
memset(t, 0, sizeof(t));
memcpy(t, num, l);
if (0 == strcmp(c, t))
{
memset(a, 0, sizeof(a));
memcpy(a, b, sizeof(b));
memset(b, 0, sizeof(b));
revstr(c);
memcpy(b, c, sizeof(c));
memset(t, 0, sizeof(t));
memcpy(t, num + l, strlen(num) - l);
if (0 == strcmp("", t))
return true;
return isOK(t, a, b);
}
return false;
}
bool isAdditiveNumber(char* num) {
int i, j;
int l = strlen(num);
char a[1000], b[1000];
char t[1000];
for (i = 1; i <= l / 2; i++)
{
if (i >= 2 && num[0] == '0')
break;
for (j = 1; (l - j - i) >= i && (l - j - i) >= j; j++)
{
if (j >= 2 && num[i] == '0')
break;
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(t, 0, sizeof(t));
memcpy(a, num, i);
memcpy(b, num + i, j);
memcpy(t, num + i + j, strlen(num) - i - j);
revstr(a);
revstr(b);
if (isOK(t, a, b))
return true;
}
}
return false;
}