连续自然数的和

guocai_yao 2011-08-22 10:38:50

// 说明1. 这道题目是POJ No.2140 Herd Sums,连续自然数的和等于某一个数的,如:
// 输入:15
// 输出:4
// 其组合为:7+8;4+5+6;1+2+3+4+5;
// 说明2.不讨论这道题的求解,只讨论p()函数的实现,此函数来自《短码之美》
#include <stdio.h>

int i, r = 1;

void p(int m , int n)
{
if (m == n)
{
r++;
}
else if (m > n)
{
p(m - n , n + 1);
}
}

int main()
{
int a;
scanf("%d", &a);

for (i = 0; i <= a / 2 + 1; ++i)
{
p(a, i);
}
}


p函数的思路是:从1开始累加,什么时候其和等于输入值,就把答案数(r)加1

我的问题是:
为什么递归传入的参数是m-n,n+1?
n+1传入表示自然数在加1,m-n表示什么?
为什么递归结束的条件是:m == n?
...全文
299 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
guocai_yao 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 luotaotao 的回复:]

p(m,n)函数的功能是:检验是否存在以n开始的连续整数之和为m,即等价于检验是否存在K使得等式n+(n+1)+……+K=m成立。
递归传入的参数之所以是m-n,n+1,本质上就是把上面的等式左边的n移到了右边,等式就变成了(n+1)+(n+2)+……+K=m-n,等价于调用p(m-n,n+1),递归到最后等式左边只有K,此时成了当前的n,等式右边成了当前的m(因为p(m - n , n + ……
[/Quote]
发帖之后,我也想明白了。但是没办法用形式化的语言描述。luotaotao牛叉!
honbaa 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 luotaotao 的回复:]

p(m,n)函数的功能是:检验是否存在以n开始的连续整数之和为m,即等价于检验是否存在K使得等式n+(n+1)+……+K=m成立。
递归传入的参数之所以是m-n,n+1,本质上就是把上面的等式左边的n移到了右边,等式就变成了(n+1)+(n+2)+……+K=m-n,等价于调用p(m-n,n+1),递归到最后等式左边只有K,此时成了当前的n,等式右边成了当前的m(因为p(m - n , n + ……
[/Quote]
wjm371002515 2011-08-22
  • 打赏
  • 举报
回复
[code=c/c++]
[/code]
luotaotao 2011-08-22
  • 打赏
  • 举报
回复
p(m,n)函数的功能是:检验是否存在以n开始的连续整数之和为m,即等价于检验是否存在K使得等式n+(n+1)+……+K=m成立。
递归传入的参数之所以是m-n,n+1,本质上就是把上面的等式左边的n移到了右边,等式就变成了(n+1)+(n+2)+……+K=m-n,等价于调用p(m-n,n+1),递归到最后等式左边只有K,此时成了当前的n,等式右边成了当前的m(因为p(m - n , n + 1)),于是最后递归结束的条件便是:m == n
wjm371002515 2011-08-22
  • 打赏
  • 举报
回复

#include <stdio.h>

void p(int m , int n)
{
int sum = 0; //声明一个求和的变量
int i = m; //把初始的计算值保存到一个临时变量中

//判断是否有符合条件的连续数
while (sum < n)
{
sum += i;
i ++;
}
//这里我考虑到了最后一个数不需要加+所以打印到倒数第二个数单独在打印出最后一个数
i --;
if (sum == n){
printf ("一种组合:");
for (; m < i; m ++)
printf ("%d + ",m);
printf ("%d",m);
printf ("\n");
return;
}

else
return;
}

int main()
{
int a;
scanf("%d", &a);

for (int i = 1; i <= a / 2; ++i) //这里我觉得从一开始就可以了 要不然15 = 0 + 1 + 2 + 3 + 4 + 5相当于增加了时间复杂度 还有到的话应该是a/2这个自己想象把
{
p(i, a); //这这里的参数位置我换过了
}
return 0;
}

这个是我根据你的改变的
我不喜欢全局变量
都改成了临时变量 自己看看

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧