拆分自然数
题目描述
一个 0-1000 的整数,拆解为一个(本身)或多个连续自然数的和,按照自然数的个数从少到多输出各个方案 input = solution,方案内的自然数按照从小到大排列
分析:其实就是数学题: 若一个数n等于连续多个自然数之和,则由等差数列(a1+an)h/2== n,以及an-a1 == n-1,可解得 a1=(n*2/h-h+1)/2和an=a1+h-1(也就是该连续自然数的第一个数和最后一个数) 因为除法会带来误差,因此验证一下(a1+an)h==2n即可
#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;
}