c语言练习76: 找出中枢整数

找出中枢整数

题⽬描述:

给你⼀个正整数 n ,找出满⾜下述条件的 中枢整数 x : 1 和 x 之间的所有元素之和等于 x 和 n 之间所有元素之和。 返回中枢整数 x 。如果不存在中枢整数,则返回 -1 。题⽬保证对于给定的输⼊,⾄多存在⼀个中枢整 数。

• ⽰例 1:

输⼊:n = 8

输出:6

解释:6 是中枢整数,因为 1 + 2 + 3 + 4 + 5 + 6 = 6 + 7 + 8 = 21 。

• ⽰例 2: 输⼊:n = 1

输出:1

解释:1 是中枢整数,因为 1 = 1 。

• ⽰例 3: 输⼊:n = 4 输出:-1 解释:可以证明不存在满⾜题⽬要求的整数。

解法⼀(数学,枚举): 很显然,我们可以将 1~x 和 x~n 的和都看作等差数列(公差都为1)求和的形式。因此,我们可以 利⽤等差数列求和公式直接判断某个数是否满⾜题意。

从前往后遍历每个数,判断其是否满⾜题意。 ⼀旦遇到满⾜题意的数,直接返回该数即可。

等差数列求和: 设等差数列的⾸项为 a1 ,公差为 d ,则前 n 项和 Sn 可以表⽰为: Sn = n/2 * (a1 + an)

算法思路:

1. 从前往后遍历整数 1~n ,当遍历到 i 时,判断 i 是否满⾜ 1 和 i 之间的所有元素之和等于 i 和 n 之间所有元素之和;

2. 若满⾜,直接返回 i ,否则继续遍历。

3. 若 1~n 遍历完成时未找到满⾜题意的值,则返回-1

代码:

int pivotInteger(int n) {
	int i;
	//遍历1~n
	for (i = 1; i <= n; i++) {
		//若i满⾜1~i的和与i~n的和相等,则返回i
		if ((1 + i) * i / 2 == (i + n) * (n - i + 1) / 2) {
			return i;
		}
	}
	//当1~n都不能满⾜题意时,返回-1
	return -1;
}

解法⼆(数学):

假设 x 满⾜ 1 和 x 之间的所有元素之和等于 x 和 n 之间所有元素之和,则 1~x-1 , x+1~n 之间的任何元素 i 都不能满⾜ 1 和 i 之间的所有元素之和等于 i 和 n 之间所有元素之和,

即 x 唯⼀。 假设 x 存在,则我们利⽤等差数列求和公式可以得出: (x(x+1))/2=(x+n)(n-x+1)/2 。 上式化简后得: x^2=n(1+n)/2 则满⾜条件的中枢整数⾄多只有⼀个,所以我们可以通过计算得到可能作为满⾜题意的唯⼀解,然后 只需要判断这个值是否真正满⾜题意即可。

• sqrt 函数: sqrt 函数是⼀个⽤来计算平⽅根的数学函数,它可以计算⼀个⾮负实数的平⽅根。在 C 中,包含 sqrt 函数的头⽂件为: math.h ,原型为:

double sqrt(double x);

其中, x 是要计算平⽅根的数值,函数返回的是⼀个 double 类型的数值,表⽰ x 的平⽅根。 如果 x 是⼀个负数, sqrt 函数会返回 NaN(Not a Number)。

算法思路:

1. 利⽤ sqrt 函数计算出 n 的平⽅根,并将其向下取整得到⼀个整数 x ;

2. 判断 x*x 与 n(1+n)/2 的值是否相等,以此来判断 x 是否为符合要求的中枢整数;

3. 如果相等,返回 x ;

4. 否则,返回-1。

代码:

#include
int pivotInteger(int n) {
	//计算可能符合要求的中枢整数x
	int x = sqrt(n * (n + 1) / 2);
	//判断x是否可以作为符合要求的中枢整数并返回
	if (x * x == n * (n + 1) / 2) {
		return x;
	}
	//x不符合要求则中枢整数不存在,返回-1
	return -1;
}

你可能感兴趣的:(c语言,算法,数据结构)