您的位置:首页 > 其它

判断整数 x 能否表示成 n(n >= 2)个连续正整数的和

2016-06-25 22:14 417 查看
题目:如何判断一个整数 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息