输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列
思路:从1开始逐个累加,如果超过n,匹配失败,去除最小的元素,如果不足继续累加下一个,直至相等。
#include <stdio.h>
#include <stdlib.h>
int calc(int n)
{
int lastnum;
int sum;
int count;
int flag = 1;
lastnum = sum = count = 0;
int i = 0;
while (count >= 0 && lastnum <= n/2 + 1) {
if (sum < n) {
lastnum++;
printf("add %d to sum\n", lastnum);
count++;
sum += lastnum;
}else if (sum == n) { // find a match
printf(" *** match %d from %d to %d\n",
n, lastnum - count + 1, lastnum);
sum -= (lastnum - count + 1);
count--;
flag = 0;
}else if (sum > n) {
printf("reduce %d\n", lastnum - count + 1);
sum -= (lastnum - count + 1);
count--;
}
}
if ( flag )
printf("No matched for %d\n", n);
return 0;
}
int main(int argc, int *argv)
{
// int n = 8;
int n = 15;
calc(n);
return 0;
}
#include <stdlib.h>
int calc(int n)
{
int lastnum;
int sum;
int count;
int flag = 1;
lastnum = sum = count = 0;
int i = 0;
while (count >= 0 && lastnum <= n/2 + 1) {
if (sum < n) {
lastnum++;
printf("add %d to sum\n", lastnum);
count++;
sum += lastnum;
}else if (sum == n) { // find a match
printf(" *** match %d from %d to %d\n",
n, lastnum - count + 1, lastnum);
sum -= (lastnum - count + 1);
count--;
flag = 0;
}else if (sum > n) {
printf("reduce %d\n", lastnum - count + 1);
sum -= (lastnum - count + 1);
count--;
}
}
if ( flag )
printf("No matched for %d\n", n);
return 0;
}
int main(int argc, int *argv)
{
// int n = 8;
int n = 15;
calc(n);
return 0;
}