標籤:結構 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 電腦演算法分析與設計 枚舉