Chinaunix首页 | 论坛 | 博客
  • 博客访问: 588833
  • 博文数量: 201
  • 博客积分: 3076
  • 博客等级: 中校
  • 技术积分: 2333
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-02 19:44
文章分类

全部博文(201)

文章存档

2010年(118)

2009年(83)

我的朋友

分类:

2010-04-09 18:05:12

数的分解:任何数都能分解成2的幂,比如
  7=1+1+1+1+1+1+1
  =1+1+1+1+1+2
  =1+1+1+2+2
  =1+2+2+2
  =1+1+1+4
  =1+2+4
求任意整数n(n<100亿)的此类划分数

f(2m+1)=f(2m),f(2m)=f(2m-1)+f(m)
其实是递归的思路。
奇数2m+1的划分,只要对应的2m的每隔划分,+1就可以了,所以f(2m+1)=f(2m);
偶数2m的划分,分为两类,一类是划分中含有1的,这类等于f(2m-1),因为只要这类前者
每个划分-1,都对应了。另一类是划分中不含有1的,这类等于f(m),因为只要f(m)的每个
划分都乘以2,就对应了。



#include 

unsigned long f(long n)
{
if (n <= 1) return 1;
if ((n & 1) == 1) return f(n - 1);
return f(n - 1) + f(n >> 1);
}

void main()
{
long i;
for (i = 1; i < 21; i++)
{
printf("f(%ld) = %lu\n", i, f(i));
}
}

阅读(1113) | 评论(0) | 转发(0) |
0

上一篇:printf

下一篇:poj 题型

给主人留下些什么吧!~~