判断整数 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) 是否是偶数的问题。
具体实现如下:
思路分析:
(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; }
相关文章推荐
- poj_1845
- 将一个整数分解为一个或者多个素数的乘积
- HDU-4651 整数分解(生成函数)
- 整数分解(3种算法比较):hdu 1164 Eddy's research I+poj 1811 Prime Test
- 整数分解 和 java
- 正整数分解质因子
- poj1365 整数分解(质因数分解)
- 整数分界(递归)
- 球盒问题之二:n分解成m正数和解题代码
- 二次整数分解
- 快速整数分解C#
- 整数分解的C#代码
- 1059. Prime Factors (25)
- 数学问题
- 将自然数分解为连续自然数之积
- 转:【webapp的优化整理】要做移动前端优化的朋友进来看看吧
- 守护进程
- 关于RStudio中的save问题
- Android 常用方法集合工具类CommonUtil
- Android support library支持包常用控件介绍(一)