• <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 閱讀(607) 評論(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;
            }  回復  更多評論
              

            久久强奷乱码老熟女网站| 亚洲国产精品一区二区久久| 免费精品99久久国产综合精品| 精品人妻伦九区久久AAA片69| 一级做a爰片久久毛片免费陪| 99久久亚洲综合精品网站| 亚洲国产成人久久精品影视| 久久ZYZ资源站无码中文动漫| 久久久久免费看成人影片| 久久久无码人妻精品无码| 伊人久久大香线蕉av一区| 日韩精品久久久久久久电影蜜臀| 狠狠色丁香婷婷久久综合五月| 久久综合给合综合久久| 无码8090精品久久一区| 香蕉久久久久久狠狠色| 中文字幕无码久久人妻| 新狼窝色AV性久久久久久| 一本色综合网久久| 国产成人精品久久一区二区三区| 国产精品久久久久久吹潮| 青青草国产成人久久91网| 久久久久无码专区亚洲av| 亚洲国产精品成人AV无码久久综合影院| 97久久精品人人做人人爽| 天堂无码久久综合东京热| 久久精品亚洲AV久久久无码| 国产精品女同久久久久电影院| 品成人欧美大片久久国产欧美...| 久久人人爽人人澡人人高潮AV| 久久精品卫校国产小美女| 久久66热人妻偷产精品9| 久久精品国产精品亜洲毛片 | 超级97碰碰碰碰久久久久最新| 久久亚洲精品无码AV红樱桃| 国产精品嫩草影院久久| 亚洲精品tv久久久久久久久| 日韩精品国产自在久久现线拍| 中文字幕无码精品亚洲资源网久久| 99精品久久精品| 亚洲伊人久久精品影院|