程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> 關於C >> C語言實例之九位累進可除數

C語言實例之九位累進可除數

編輯:關於C

求九位累進可除數。所謂九位累進可除數就是這樣一個數:這個數用到1到9這九個數字組成,每個數字剛好只出現一次。這九個位數的前兩位能被2整除,前三位能被3整除......前N位能被N整除,整個九位數能被9整除。

  *問題分析與算法設計

  問題本身可以簡化為一個窮舉問題:只要窮舉每位數字的各種可能取值,按照題目的要求對窮舉的結果進行判斷就一定可以得到正確的結果。

  問題中給出了“累進可除”這一條件,就使得我們可以在窮舉法中加入條件判斷。在窮舉的過程中,當確定部分位的值後,馬上就判斷產生的該部分是否符合“累進可除”條件,若符合,則繼續窮舉下一位數字;否則剛剛產生的那一位數字就是錯誤的。這樣將條件判斷引入到窮舉法之中,可以盡可能早的發現矛盾,盡早地放棄不必要窮舉的值,從而提高程序的執行效率。

  為了達到早期發現矛盾的目的,不能采用多重循環的方法實行窮舉,那樣編出的程序質量較差。程序中使用的算法不再是窮舉法,而是回朔法。

  *程序說明與注釋

  #include<stdio.h>

  #define NUM 9

  int 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位的值取1*/

  else 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]的值為1*/

  else a[i]=a[i-1]+1; /*否則,a[i]的初值為a[i-1]值的"下一個"值*/

  }

  if(not_finish)

  {

  printf("\nThe progressire 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");

  }

  }

  }

  *運行結果

  The progressire divisible number is: 381654729

  *思考題

  求N位累進可除數。用1到9這九個數字組成一個N(3<=N<=9)位數,位數字的組成不限,使得該N位數的前兩位能被2整除,前3位能被3整除,......,前N位能被N整除。求滿足條件的N位數。

*
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved