leetcode_306(斐波那契数列)

看了题解。

调了很久之后,一次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;
}

猜你喜欢

转载自blog.csdn.net/qq_32862515/article/details/80903842
今日推荐