首页 > 代码库 > 杭电2058

杭电2058

#include<stdio.h>  int main()  {      int i,j,sum=0;      int n,m;      while(scanf("%d%d",&n,&m)&&n!=0&&m!=0)      {         if(n>m)          break;      else      {          for(i=1;i<=n;i++)          {              sum=0;              for(j=i;j<=n;j++)              {                  sum+=j;                  if(sum==m)                  {printf("[%d,%d]\n",i,j);                  break;}              }          }      }      }    }  

  这种办法是一一枚举的,但是会提示时间超过,不能通过

所以应该采用枚举法,但不是一一枚举

设开始的数为i,从i开始有j个数,所以m=[(i+i+j-1)/2]*j;(因为是连续的,就相当于公差为一的等差数列的求和,即为首项加上尾项的和除以项数),

同时反解出i=(2*m/j-j+1)/2

 1 #include<iostream> 2 #include<cmath> 3 using namespace std; 4 int main() 5 { 6     int m,n,i,j; 7     while(cin>>n>>m&&n||m) 8     { 9         for(j=(int)sqrt((double)(2*m));j>=1;j--)10         {11             i=(2*m/j-j+1)/2;12             if((2*i+j-1)*j/2==m)13                 cout<<[<<i<<,<<i+j-1<<]<<endl;14         }15 16 cout<<endl;17     }18 }

 

超时的错误代码

杭电2058