题目描述
一个 0-1000 的整数,拆解为一个(本身)或多个连续自然数的和,按照自然数的个数从少到多输出各个方案 input = solution,方案内的自然数按照从小到大排列
链接:牛客网
code
- 其实就是数学题:
- 若一个数n等于连续多个自然数之和,则由等差数列
(a1+an)*h/2==n
,以及an-a1==n-1
,可解得a1=(n*2/h-h+1)/2
和an=a1+h-1
(也就是该连续自然数的第一个数和最后一个数) - 因为除法会带来误差,因此验证一下
(a1+an)*h==n*2
即可
- 若一个数n等于连续多个自然数之和,则由等差数列
- (注:算法未经OJ验证
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin >> n)
{
if(n==0){
printf("0\n");
continue;
}
for(int i=1; i<=n; ++i){//拆成i个自然数之和
int x = (n*2/i-i+1)/2;
int y = x+i-1;
if((x+y)*i==n*2){
for(int j=x; j<=y; ++j){
printf("%d ",j);
}
printf("\n");
}
else if((x+y)*i>n*2){
break;
}
}
}
return 0;
}