2017.12.15 電腦演算法分析與設計 枚舉

來源:互聯網
上載者:User

標籤:結構   double   div   區間   統計   ==   數組   markdown   不能   

電腦常用演算法------第二章 枚舉(1)枚舉概述

枚舉法也稱為列舉法、窮舉法,使蠻力策略的具體表現,又稱為蠻力法。
枚舉是一種簡單而直接解決問題的方法.

(2)枚舉的基本思想是:
逐一列舉問題所涉及的所有清醒,並根據問題提出條件的條件檢驗哪些是問題的解,那些應予以排除。枚舉法常用於解決“是否存在”或“有多少種可能”等問題。
(3)枚舉的特點是
演算法設計比較簡單,只要一一列舉問題所涉及的所以情形即可。
(4)枚舉模式
實施枚舉通常是應用迴圈結構來實現

有兩種:
1.區間枚舉

    區間枚舉:通過枚舉迴圈的上下限控制枚舉區間,而在迴圈體中完成各個運算操作,然後根據所求解的具體條件,應用選擇結構實施判別與篩選,求得所要求的解。

區間枚舉設計的架構描述:

架構描述:n = 0;for(k = <區間下限>;k<=<區間上限>;k++){   //根據實際情況控制枚舉範圍     <運算操作序列>;    if(<約束條件>){   //根據約束條件實施篩選         printf(<滿足要求的解>);  //逐一輸出問題的解         n++;            //統計解的個數     }   }printf(<解的個數>);   //輸出解的個數 
**2.遞增枚舉:**
有些問題沒有明確的範圍限制,可根據問題的具體情況試探地從某一起點開始增值枚舉,對每一個數進行操作與判別,若滿足條件即輸出結果

遞增枚舉設計的架構描述:

k = 0;while(1){    k++;            //設定迴圈,枚舉變數k遞增;     <運算操作序列>;    if(<約束條件>){           //根據約束條件實施篩選與結束         printf(<滿足要求的解>);   //輸出問題的解         return ;       //返回結束     }     }

枚舉實施步驟:

(1)根據問題的具體情況確定枚舉量(簡單變數或數組)(2)根據問題的具體情況確定枚舉範圍,設定枚舉迴圈(3)根據問題的具體要求確定篩選條件(4)設計枚舉並運行、調試,對運行結果進行分析與討論。
(5)統計與求和

全素組
···素數又稱為質數,是不能被1以外的其他整數整除的整數。如2,3,5,7 2也是偶素數
···合數又稱為複數,一個整數如果能被除1與本身以外的整數整除。
···注意:1既不是質數也不是偶數

例題:例如輸入n=15,輸出 3+5+11=19為素數 則 3 5 11稱為一個基於15的全素組

//統計求和  應用試商判別素數#include<stdio.h>#include<math.h>int main(){    int i,j,k,i2,j2,k2,n,s,t,w,z,max,p[9000],q[1500];     long m;    printf("請輸入一個整數n:");    scanf("%d",&n);    for(int i= 0;i<= 3*n;i = i+2){        t = 1;        z = (int)sqrt(i);        for(int j = 3;j<= z;j++){            if(i%j==0){                t = 0;                break;            }            if(t == 1){   //奇數i為素數時標記p[i]=1                 p[i] = 1;            }            w = 0;            for(int i = 3;i<= n;i=i+2){                if(p[i] == 1){                    w++;                    q[w] = i;    //共有w個不大於n的奇素數賦給q數組                 }            }        }    }                m = 0;                max = 0;                for(int i = 1;i<= w-2;i++)  //設定三重迴圈枚舉所有三個素數數組                 for(int j = i+1;j<= w-1;k++)                   for(int k = j+1;k<=w;k++){                    s = q[i]+q[j]+q[k];   //統計三個元素之和                     if(p[s] == 1){                        m++;                        if(s>max){   //比較並記錄最大全素組                             max = s;                            i2 = q[i];                            k2 = q[k];                        }                    }                }                    printf("共有%ld個素組\n",m);                    if(m>0)                    printf("一個最大全素組為:%d+%d+%d=%ld\n",i2,j2,k2,max);} 

最簡真分數(分子小於分母,且分子分母無公因數)

#include<stdio.h>#include<math.h>int main(){    int a,b,i,j,t,u;    long m = 0;    double s;    printf("最簡真分母在[a,b]內,請確定a、b:");    scanf("%d,%d",&a,&b);//輸入區間上下限     s = 0;        for(int j = a;j<= b;j++)   //枚舉分母     for(int i = 1;i<= j-1;i++){   //枚舉分子         for(t = 0,u = 2;u<= i;u++){  //枚舉因數             if(j%u == 0 && i%u == 0){                t = 1;                break;   //分子分母有公因數,捨去             }            if(t == 0)            {                m++;//統計最簡真分數個數                 s+=(double)i/j; //求最簡真分數的和             }        }    }        printf("最簡真分數共m=%ld個。\n",m);        printf("其和s=%.5f\n",s);}
(6)解方程

佩爾方程
x^2+ny=1(其中n為非平方正整數)

常把x、y中有一個為零的解稱為平凡解x、y滿足方程的最小正數的解又稱為基本解

程式設計:

#include<stdio.h>#include<math.h> void main(){    double a,m,n,x,y;    printf("解佩爾方程:x^2-ny^2=1.\n");    printf("請輸入非平方整數n:");    scanf("%lf",&n);    m = floor(sqrt(n+1));    if(m*n == n){        printf("n為平方數,方程無正整數解");        return;    }    y = 1;        y++;        a = n*y*y;        x = floor(sqrt(a+1));        if(x*x == a+1){            printf("方程x^2-%.0fy^2 = 1的基本解為:\n",n);            printf("x = %.0f,y = %.0f\n",x,y);            break;        }    }}
(7)解不等式

程式設計:

#include<stdio.h>#include<math.h>int main(){    long c,d,i,m1,m2;    double s;    printf("請輸入正整數m1,m2(m1<m2):");    scanf("%ld,%ld",&m1,&m2);    i = 0;    s = 0;    while(s<= m1){        i = i+1;        s = s+sqrt(i)/(i+1);    }    c = i;    do{        i = i+1;        s = s+sqrt(i)/(i+1);    }    while(s<=m2){        d = i-1;        printf("滿足不等式的正整數n為:%ld<=n<=%ld\n",c,d);    }} 

2017.12.15 電腦演算法分析與設計 枚舉

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.