• <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++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
              197 隨筆 :: 3 文章 :: 37 評(píng)論 :: 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ì)死循環(huán)    
            26            nSum+=n2;   //這步要小心    
            27        }
                
            28    }
                
            29    return 0;    
            30}
                
            31

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

            關(guān)鍵就在那個(gè)通項(xiàng)公式,(n1+n2)*(n2-n1+1) == n*2
            這里如果先把n乘以2,然后的問(wèn)題可不可以看成是因子分解?答案很明顯。
            假如分解出的結(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)),顯示會(huì)比之前第二段代碼要節(jié)省非常多的時(shí)間。

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

            評(píng)論

            # 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)前已分配的存儲(chǔ)空間,以元素為單位
            }SqStack; // 順序棧

            //bo3-1.c 順序棧(存儲(chǔ)結(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); /* 存儲(chǔ)分配失敗 */
            (*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ù),即棧的長(zhǎng)度 */
            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) /* 棧滿,追加存儲(chǔ)空間 */
            {
            (*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+2)*sizeof(SElemType));
            if(!(*S).base)
            exit(OVERFLOW); /* 存儲(chǔ)分配失敗 */
            (*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))
            { /* 從棧底到棧頂依次對(duì)棧中每個(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ù)  更多評(píng)論
              

            久久久久国产亚洲AV麻豆| 伊人久久大香线蕉综合影院首页| 青青草国产精品久久| 久久人人爽人人精品视频| 久久久www免费人成精品| 精品久久久久久中文字幕| 性做久久久久久久久老女人| 亚洲狠狠婷婷综合久久蜜芽| 精品久久国产一区二区三区香蕉 | 人妻无码久久精品| 无码人妻精品一区二区三区久久久| 久久成人精品视频| 日韩电影久久久被窝网| 久久精品中文騷妇女内射| 青青青青久久精品国产h久久精品五福影院1421 | 亚洲精品乱码久久久久久按摩 | 亚洲国产精品无码久久98| 国产高潮国产高潮久久久91 | 久久国产亚洲高清观看| 亚洲精品tv久久久久| 久久精品男人影院| 亚洲AV日韩AV天堂久久| 亚洲一级Av无码毛片久久精品| 国产亚洲精品美女久久久| 久久精品国产99久久久古代| 蜜臀久久99精品久久久久久| 国产亚州精品女人久久久久久| 久久精品人人做人人爽电影| 99久久精品费精品国产一区二区| 国产成人精品综合久久久久| 亚洲国产成人久久一区WWW| 香蕉久久夜色精品国产小说| 久久精品人人做人人爽电影蜜月| 国产aⅴ激情无码久久| 伊人久久大香线蕉无码麻豆| 色8激情欧美成人久久综合电| 国内精品久久久久久中文字幕| 伊人久久免费视频| 国产综合精品久久亚洲| 久久一本综合| 久久婷婷五月综合成人D啪|