ZCMU-1348-整数划分

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值