题目:如何判断一个整数 x 是否可以表示成 n(n >= 2)个连续正整数的和。
思路分析:
(1)假设 x 可以表示成 n(n >= 2)个连续正整数的和,那么数学表达式如下:x = m + (m + 1) + (m + 2) + … + (m + n - 1),其中 m 为分解成的连续整数中最小的那一个(且 m 是大于等于 1 的正整数),可推出 x = (2m + n - 1)*n/2,变换之后 m = (2*x/n - n + 1)/2;
(2)由 m 的取值范围可知 (2*x/n - n + 1)/2 >= 1,又因为 m 是正整数,所以(2*x/n - n + 1) 一定要为偶数;否则m = (2*x/n - n + 1)/2 就是小数了,不符合要求;(注意:(2*x/n - n + 1) 看成是 float 类型的)
(3)以上就是 x 和 n 的关系。给定一个 n,看 x 是否能分解成 n 个连续整数的和,可以判断是否存在 m,也就是 (2*x/n - n + 1) 是否是偶数的问题。
具体实现如下:
#include <iostream>
int main(int argc, const char * argv[]) {
int x = 0, n = 0;
float temp = 0.0;
printf("输入要被分解的数: ");
scanf("%d", &x);
printf("输入要被分解的数字的个数: ");
scanf("%d", &n);
temp = (float)2*x/n - (float)(n - 1); // 能否分解主要取决于 (int)temp 是否为偶数;
int m = (int)temp/2; // m是分解成的连续正整数中最小的那一个;
if ((int)temp % 2 == 0 && m >= 1) // (int)temp 是偶数且不为0;
{
printf("%d可分解为:", x);
int start = m;
int end = m + n - 1;
while (start <= end)
{
printf("%d ", start);
start++;
}
}
else // (int)temp 是奇数;或(int)temp 等于0;
{
printf("不能分解\n");
}
return 0;
}