书上讲了一种提高效率的方法。原始算法:用i遍历1到n-1,如果i到j的和等于n那么就输出相应的结果。我们可以发现当sum(i,j)=n时,继续j++,sum+=j,计算的sum肯定是大于n的,于是便在sum(i,j)=n输出结果后,sum-=i,再继续sum+=j等后续工作,这样避免了无用功。
#include <iostream>
#include<cstdio>
using namespace std;
void f(int x){
int i=1,j=2,sum=i;
while(i<=x/2){
if(sum>=x)break;
else if(sum<x){
for(;j<=x/2+1;j++){
sum+=j;
if(sum==x){
printf("%d~%d\n",i,j);
sum-=i;
i++;
if(i>x/2)break;
}
else if(sum>x){
do{
sum-=i;
i&