1348: 整数拆分
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 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;
}