• <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++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              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為最開頭的數(shù),n2是最末尾    
             7    {    
             8        if(nSum<n)      //總和偏小    
             9        {    
            10            n2++;       //末尾加數(shù)    
            11            nSum+=n2;    
            12        }
                
            13        else if(nSum>n) //總和偏大    
            14        {    
            15            nSum -= n1; //開頭刪數(shù)    
            16            n1++;    
            17        }
                
            18        else //if(nSum==n) //相等就輸出結(jié)果    
            19        {    
            20            for(int t=n1; t<=n2; t++)    
            21            {    
            22                printf("%d,", t);    
            23            }
                
            24            printf("\n");    
            25            n2++;       //末尾加數(shù),如果不加就會死循環(huán)    
            26            nSum+=n2;   //這步要小心    
            27        }
                
            28    }
                
            29    return 0;    
            30}
                
            31

            問題:還有更快的辦法嗎?請仔細(xì)觀察第一段代碼,看得出哪個(gè)特點(diǎn)可以利用不?

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

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

            評論

            # re: 把整數(shù)分解為連續(xù)整數(shù)之和(轉(zhuǎn)) 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;

            // 函數(shù)結(jié)果狀態(tài)代碼
            #define TRUE 1
            #define FALSE 0
            #define OK 1
            #define ERROR 0
            #define INFEASIBLE -1
            // #define OVERFLOW -2 因?yàn)樵趍ath.h中已定義OVERFLOW的值為3,故去掉此行
            typedef int Status; // Status是函數(shù)的類型,其值是函數(shù)結(jié)果狀態(tài)代碼,如OK等
            typedef int Boolean; // Boolean是布爾類型,其值是TRUE或FALSE

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

            //bo3-1.c 順序棧(存儲結(jié)構(gòu)由c3-1.h定義)的基本操作(9個(gè))
            Status InitStack(SqStack *S,int Init_SIZE)
            { // 構(gòu)造一個(gè)空棧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的元素個(gè)數(shù),即棧的長度 */
            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))
            { /* 從棧底到棧頂依次對棧中每個(gè)元素調(diào)用函數(shù)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;
            }  回復(fù)  更多評論
              

            久久免费视频1| 久久久久久一区国产精品| 97久久国产露脸精品国产 | 亚洲伊人久久精品影院| 久久99精品久久久大学生| 99国产精品久久久久久久成人热| 超级碰久久免费公开视频| 亚洲国产成人久久综合区| 精品久久久久久亚洲精品| 色天使久久综合网天天| AAA级久久久精品无码片| 亚洲欧美久久久久9999 | 久久久这里有精品| 欧美日韩中文字幕久久伊人| 狠狠色丁香久久婷婷综合蜜芽五月| 亚洲国产婷婷香蕉久久久久久| 婷婷久久久亚洲欧洲日产国码AV| 国产成人精品久久亚洲| 久久精品国产亚洲av麻豆小说| 亚洲国产成人乱码精品女人久久久不卡 | 久久久久久免费一区二区三区| 老男人久久青草av高清| 久久久91人妻无码精品蜜桃HD| 久久精品成人免费看| 狠狠色丁香久久婷婷综合五月 | 乱亲女H秽乱长久久久| 一级做a爰片久久毛片免费陪| 99久久精品国产一区二区蜜芽| 久久久久久国产精品无码超碰| 亚洲日本va中文字幕久久| 波多野结衣AV无码久久一区| 久久亚洲AV无码精品色午夜麻豆 | 久久香蕉综合色一综合色88| 精品久久久久久国产潘金莲 | 久久精品人人做人人爽电影| 久久精品国产亚洲av高清漫画| 性高湖久久久久久久久| 久久人人爽人人爽人人片av高请| 久久精品青青草原伊人| 精品久久人妻av中文字幕| 999久久久免费精品国产|