• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            life02

              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              197 隨筆 :: 3 文章 :: 37 評論 :: 0 Trackbacks

            http://student.csdn.net/space.php?uid=32341&do=blog&id=1716

             1#include <stdio.h>    
             2int main(void)    
             3{    
             4    int n, nSum=1;// nSum 保存總和    
             5    scanf("%d"&n);// 輸入要分解的n    
             6    for(int n1=1, n2=n1; n1<=n/2; )// n1為最開頭的數,n2是最末尾    
             7    {    
             8        if(nSum<n)      //總和偏小    
             9        {    
            10            n2++;       //末尾加數    
            11            nSum+=n2;    
            12        }
                
            13        else if(nSum>n) //總和偏大    
            14        {    
            15            nSum -= n1; //開頭刪數    
            16            n1++;    
            17        }
                
            18        else //if(nSum==n) //相等就輸出結果    
            19        {    
            20            for(int t=n1; t<=n2; t++)    
            21            {    
            22                printf("%d,", t);    
            23            }
                
            24            printf("\n");    
            25            n2++;       //末尾加數,如果不加就會死循環    
            26            nSum+=n2;   //這步要小心    
            27        }
                
            28    }
                
            29    return 0;    
            30}
                
            31

            問題:還有更快的辦法嗎?請仔細觀察第一段代碼,看得出哪個特點可以利用不?

            關鍵就在那個通項公式,(n1+n2)*(n2-n1+1) == n*2
            這里如果先把n乘以2,然后的問題可不可以看成是因子分解?答案很明顯。
            假如分解出的結果是n*2 = a*b ,
            那就解方程組 n1+n2=a, n2-n1+1=b
            即n1=(a-b+1)/2, n2=(a+b-1)/2
            如果解出的結果n1和n2是整數的話(即要使a和b一奇一偶),顯然就得到一組解了
            而因子分解的復雜度是O(sqrt(n)),顯示會比之前第二段代碼要節省非常多的時間。

            posted on 2009-09-28 09:03 life02 閱讀(605) 評論(1)  編輯 收藏 引用 所屬分類: 算法

            評論

            # re: 把整數分解為連續整數之和(轉) 2009-09-28 20:22 life02
            #include <iostream>
            #include<string.h>
            #include<ctype.h>
            #include<malloc.h> //malloc()等
            #include<limits.h> // INT_MAX等
            #include<io.h> // eof()
            #include<math.h>
            using namespace std;

            // 函數結果狀態代碼
            #define TRUE 1
            #define FALSE 0
            #define OK 1
            #define ERROR 0
            #define INFEASIBLE -1
            // #define OVERFLOW -2 因為在math.h中已定義OVERFLOW的值為3,故去掉此行
            typedef int Status; // Status是函數的類型,其值是函數結果狀態代碼,如OK等
            typedef int Boolean; // Boolean是布爾類型,其值是TRUE或FALSE

            typedef int SElemType; // 定義棧元素類型為整型
            typedef struct SqStack
            {
            SElemType *base; // 在棧構造之前和銷毀之后,base的值為NULL
            SElemType *top; // 棧頂指針 */
            int stacksize; // 當前已分配的存儲空間,以元素為單位
            }SqStack; // 順序棧

            //bo3-1.c 順序棧(存儲結構由c3-1.h定義)的基本操作(9個)
            Status InitStack(SqStack *S,int Init_SIZE)
            { // 構造一個空棧S
            (*S).base=(SElemType *)malloc(Init_SIZE*sizeof(SElemType));
            if(!(*S).base)
            exit(OVERFLOW); /* 存儲分配失敗 */
            (*S).top=(*S).base;
            (*S).stacksize=Init_SIZE;
            return OK;
            }

            Status DestroyStack(SqStack *S)
            { /* 銷毀棧S,S不再存在 */
            free((*S).base);
            (*S).base=NULL;
            (*S).top=NULL;
            (*S).stacksize=0;
            return OK;
            }

            Status ClearStack(SqStack *S)
            { /* 把S置為空棧 */
            (*S).top=(*S).base;
            return OK;
            }

            Status StackEmpty(SqStack S)
            { /* 若棧S為空棧,則返回TRUE,否則返回FALSE */
            if(S.top==S.base)
            return TRUE;
            else
            return FALSE;
            }

            int StackLength(SqStack S)
            { /* 返回S的元素個數,即棧的長度 */
            return S.top-S.base;
            }

            Status GetTop(SqStack S,SElemType *e)
            { /* 若棧不空,則用e返回S的棧頂元素,并返回OK;否則返回ERROR */
            if(S.top>S.base)
            {
            *e=*(S.top-1);
            return OK;
            }
            else
            return ERROR;
            }

            Status Push(SqStack *S,SElemType e)
            { /* 插入元素e為新的棧頂元素 */
            if((*S).top-(*S).base>=(*S).stacksize) /* 棧滿,追加存儲空間 */
            {
            (*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+2)*sizeof(SElemType));
            if(!(*S).base)
            exit(OVERFLOW); /* 存儲分配失敗 */
            (*S).top=(*S).base+(*S).stacksize;
            (*S).stacksize+=2;
            }
            *((*S).top)++=e;
            return OK;
            }

            Status Pop(SqStack *S,SElemType *e)
            { /* 若棧不空,則刪除S的棧頂元素,用e返回其值,并返回OK;否則返回ERROR */
            if((*S).top==(*S).base)
            return ERROR;
            *e=*--(*S).top;
            return OK;
            }

            Status StackTraverse(SqStack S,Status(*visit)(SElemType))
            { /* 從棧底到棧頂依次對棧中每個元素調用函數visit()。 */
            /* 一旦visit()失敗,則操作失敗 */
            while(S.top>S.base)
            visit(*S.base++);
            printf("\n");
            return OK;
            }
            Status visit(SElemType c)
            {
            printf("%d ",c);
            return OK;
            }

            void spell(int num){

            SqStack s;
            InitStack(&s,(num/2+1));
            int i=0;
            int sum=0;
            int j=0;
            while(i<=(num/2+1)){
            if (sum<num)
            {
            i++;
            Push(&s,i);
            sum+=*(s.top-1);

            }else if (sum>num)
            {
            sum-=*(s.base);
            s.base++;

            }else{
            int* temp=s.base;
            int k=0;
            /* cout<<"hell"<<endl;*/
            while(k<StackLength(s)){
            cout<<*temp<<" ";
            temp++;
            k++;
            }
            cout<<endl;
            i++;
            Push(&s,i);
            sum+=*(s.top-1);

            }
            }

            }

            int main(){
            spell(1245);

            return 0;
            }  回復  更多評論
              

            久久久久一级精品亚洲国产成人综合AV区| 婷婷五月深深久久精品| 久久久久亚洲AV无码专区桃色| 久久精品国产欧美日韩| 久久久久亚洲AV无码专区首JN| 亚洲中文久久精品无码ww16| 亚洲综合婷婷久久| 97久久国产露脸精品国产| 久久久久免费精品国产| 久久久这里有精品中文字幕| 久久亚洲美女精品国产精品| 久久综合久久伊人| 久久免费精品一区二区| 亚洲欧美日韩中文久久| 久久亚洲2019中文字幕| 久久99精品综合国产首页| 国内精品综合久久久40p| 久久婷婷人人澡人人| 久久久中文字幕| 久久精品国产清高在天天线| 日日狠狠久久偷偷色综合免费 | 日韩欧美亚洲国产精品字幕久久久| 欧美亚洲色综久久精品国产| 久久久这里有精品| 久久久久国产一级毛片高清板| 欧美精品一区二区精品久久| 久久婷婷激情综合色综合俺也去| 超级97碰碰碰碰久久久久最新| 久久天天躁狠狠躁夜夜2020老熟妇| 91精品观看91久久久久久| 99国产精品久久| 久久91精品国产91久久小草| 色婷婷综合久久久久中文一区二区| 久久成人国产精品免费软件| 麻豆精品久久久久久久99蜜桃| 国产精品久久新婚兰兰| 97视频久久久| 国产精品久久免费| 国内精品久久久久久久coent| 久久99精品国产麻豆不卡| 久久亚洲国产成人影院网站 |