求九位累進可除數。所謂九位累進可除數就是這樣一個數:這個數用到1到9這九個數字組成,每個數字剛好只出現一次。這九個位元的前兩位能被2整除,前三位能被3整除……前N位能被N整除,整個九位元能被9整除。
*問題分析與演算法設計問題本身可以簡化為一個窮舉問題:只要窮舉每位元字的各種可能取值,按照題目的要求對窮舉的結果進行判斷就一定可以得到正確的結果。s問題中給出了“累進可除”這一條件,就使得我們可以在窮舉法中加入條件判斷。在窮舉的過程中,當確定部分位的值後,馬上就判斷產生的該部分是否符合“累進可除”條件,若符合,則繼續窮舉下一位元字;否則剛剛產生的那一位元字就是錯誤的。這樣將條件判斷引入到窮舉法之中,可以儘可能早的發現矛盾,儘早地放棄不必要窮舉的值,從而提高程式的執行效率。為了達到早期發現矛盾的目的,不能採用多重迴圈的方法實行窮舉,那樣編出的程式品質較差。程式中使用的演算法不再是窮舉法,而是回朔法。
#include <stdio.h>#define NUM 9int a[NUM+1];int main(){int i,k,flag,not_finish=1;long sum;i=1;//i:正在處理的數組元素,表示前i-1個元素已經滿足要求,正處理的是第i個元素a[1]=1;//為元素a[1]設定初值while(not_finish)//not_finish=1:處理沒有結束{while(not_finish&&i<=NUM){for(flag=1,k=1;flag&&k<i;k++)if(a[k]==a[i])flag=0;//判斷第i個元素是否與前i-1個元素重複for(sum=0,k=1;flag&&k<=i;k++){sum=10*sum+a[k];if(sum%k)flag=0;//判斷前k位組成的整數是否能被k整除}if(!flag)//flag=0:表示第i位不滿足要求,需要重新設定{if(a[i]==a[i-1])//若a[i]的值已經經過一圈追上a[i-1]{i--;//i值減1,退回處理前一個元素if(i>1&&a[i]==NUM)a[i]=1;//當第i位的值達到NUM時,第i位的值取1else if(i==1&&a[i]==NUM)//當第1位的值達到NUM時結束not_finish=0;//置程式結束標記else a[i]++;//第i位的值取下一個,加1}else if(a[i]==NUM) a[i]=1;else a[i]++;}else//第i位已經滿足要求,處理第i+1位if(++i<=NUM)//i+1處理下一元素,當i沒有處理完畢時if(a[i-1]==NUM) a[i]=1;//若i-1的值已為NUM,則a[i]的值為1else a[i]=a[i-1]+1;//否則,a[i]的初值為a[i-1]值的“下一個”值}if(not_finish){printf("The progressive divisiable number is:");for(k=1;k<=NUM;k++)//輸出計算結果printf("%d",a[k]);if(a[NUM-1]<NUM) a[NUM-1]++;else a[NUM-1]=1;not_finish=0;printf("\n");}}return 0;}