1. 程式人生 > >藍橋杯演算法訓練 連續正整數的和

藍橋杯演算法訓練 連續正整數的和

 演算法訓練 連續正整數的和   時間限制:1.0s   記憶體限制:256.0MB 問題描述   78這個數可以表示為連續正整數的和,1+2+3,18+19+20+21,25+26+27。
  輸入一個正整數 n(<=10000)
  輸出 m 行(n有m種表示法),每行是兩個正整數a,b,表示a+(a+1)+...+b=n。
  對於多種表示法,a小的方案先輸出。 樣例輸入 78 樣例輸出 1 12
18 21
25 27

AC code:

#include<stdio.h>
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
	int n,s,an,i,ans,cnt,fg;
	double a1;
	while(scanf("%d",&n)!=EOF)
	{
		ans=0;
		int mm=0.5*(-1+sqrt(1+8*n)); //列舉的最大範圍 
		for(cnt=mm;cnt>=2;cnt--)
		{
			a1=(2*n+cnt-cnt*cnt)*1.0/(2.0*cnt);
			if(int(a1)==a1&&a1>0)
			{
				printf("%d %d\n",int(a1),int(a1+cnt-1));
			}
		}
	}	
	return 0;
}