您的位置:首页 > 其它

ZCMU-1348-整数划分

2017-01-03 20:27 267 查看

1348: 整数拆分

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 333  Solved: 66

[Submit][Status][Web
Board]

Description

对于每个正整数都可以表达成k(k>=1)个连续的正整数之和。例如15=1+2+3+4+5=4+5+6=7+8=15,所以15一共4种拆分方法。你的任务是输入一个正整数n,输出n有几种拆法。

Input

多组测试数据,每组测试数据包含一个正整数n(1<=n<=10^5)。

Output

对于每组测试数据,输出一个整数代表n有几种拆法。

Sample Input

15

Sample Output

4

【解析】
这道题的话其实我们可以这么想,如果这个整数只有一个划分,那么就是n,如果有两个那就是n,n+1,n+2,如果有三
个那就是n, n,n+1, n,n+1,n+2.所以一直到如果有m种划分那就是n+...+n+m-1,这样的话其实满足一个公式的其实就
是(i * x + i * (i - 1) / 2) = n,i为当前划分后相加的正整数个数。拿15举例子吧当i = 1时,即划分成一个正
整数时,x = 15, 当i = 2时, x = 7。当x = 3时,x = 4, 当x = 4时,4/9,不是正整数,因此,15不可能划分成
4个正整数相加。当x = 5时,x = 1。还有一点就是i的范围我们要确立很显然既然有(i
* x + i * (i - 1) / 2)=n那么就说明i*(i-1)/2最大也不能超过n所以我们的范围就已经知道了。
#include<stdio.h>
int facs(int n)
{
int i, j, m = 0, x, t1, t2;
for(i = 1; (t1=i * (i - 1) / 2) < n; i++)//i的范围
{
t2 = (n-t1);
x =  t2 /i;
if(x <= 0)
break;
if((n - t1)%i == 0)
{
m++;
}
}
return m;
}
int main()
{
int n,m;
while(~scanf("%d",&n))
{
m=facs(n);
printf("%d\n",m);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: