ZCMU-1348-整数划分

来源:互联网 发布:pam打分矩阵 编辑:程序博客网 时间:2024/04/30 06:12

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;}

0 0
原创粉丝点击