2009-03-28 18:51:55來源不明

ACM 668 Parliament

此方法由阿飆同學提供

2+3+4+5...+N如果超過的話在倒著加回去

例如8

2+3+4超過8

2+3 (2+3+?==8 ?=3)

(0+1)+(2+1)+(3+1) = 1 + 3 + 4

此時發現1不可存在 把1丟到最後面去 變成 3 + 5

/************************************************************/

#include<stdio.h>
#include<stdlib.h>
main()
{
 int n,m,a,b;
 while(scanf("%d",&n)==1)
  {
   while(n--)
     {
      int temp=0,ans[50]={0},temp2;
      scanf("%d",&m);
       for(a=2,b=1;a<=m;a++,b++)
        {
         temp=temp+a;
         temp2=a;
         if(temp==m) {ans[b]=a;break;}
         if(temp>m) break;
         ans[b]=a;
        }
       if(temp==m)
        {
         for(a=1;a<=b;a++)
          printf("%d ",ans[a]);
           printf("\n");
        }
       else
        {
         int top=b-1;
         temp=temp-m;
         temp2-=temp;
         for(a=b-1;a>=b-temp2;a--)
          ans[a]++;
         if(ans[0]==1) ans[top]++;
          for(a=1;a<b;a++)
          printf("%d ",ans[a]);
           printf("\n");
        }   
     }
  }
 return 0;
}