n位逐位整除數

n位逐位整除數是什麼

n位逐位整除數(簡稱整除數):從其高位開始,高1位能被整數1整除(顯然),高2位能被整數2整除,…,整個n位能被整數n整除。給定整數n,求所有的n位整除數的個數。

形如123258,前一位 1 自然能被1整除;前二位爲12,也能被2整除;前3位爲123,能被3整除,例如這種前n位的值,能被n整除的數,就被稱爲逐位整除數。

開闢空間並初始化

先開闢一段空間,來存儲數據,先將所有空間初始化,順便初始化一些數據

 for(j=1;j<=101;j++) {
  	a[j]=0;
  }
t=0;sum=0;
i=1;a[1]=1;

判斷已取的 n位數能否被 n 整除

其中,判斷已取的 n位數能否被 n 整除,設置循環:

for(r=0,j=1;j<=i;j++)   
       { 
	     r=r*10+a[j]; 
	     r=r%i; 
		}

r取值的含義

當 r = 0時,即代表被整除,此時 t =0;
若已經取了n位,那麼就輸出;
若沒有取到n位,就繼續探索下一位
當 r = 1時,即代表未被整除,此時 t =1;
此時a[i]=a[i]+1,即第i位增1後繼續;
若增值至a[i]>9,則a[i]=0即該位清零後i=i-1迭代回溯到前一位,直到第1位增值超過9後退出循環結束;

 if(r!=0) 
          { 
			a[i]=a[i]+1;
			t=1;    
	        while(a[i]>9 && i>1) 
		     { 
			 a[i]=0;
		     i--;          
		     a[i]=a[i]+1;
		     }    
        	}
else {
	t=0;  
	}

輸出條件設置

當位數滿足用戶需要的位數並且 t==0;則滿足所需條件,sum++。
最後輸出sum,即n爲整除數的數目。

總代碼與輸出示例:


#include<stdio.h>
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;


void backtrack(int *a, int t, int n, int &sum)
{
    // 請在這裏補充代碼,完成本關任務
    /********* Begin *********/
    int i,j,r;
  for(j=1;j<=101;j++) {
  	a[j]=0;
  }
  t=0;sum=0;
  i=1;a[1]=1;
  while(a[1]<=9)
   { 
   if(t==0 && i<n) {
   		i++;
   }
    for(r=0,j=1;j<=i;j++)   
       { 
	     r=r*10+a[j]; 
	     r=r%i; 
		}
         if(r!=0) 
          { 
			a[i]=a[i]+1;
			t=1;    
	        while(a[i]>9 && i>1) 
		     { 
			 a[i]=0;
		     i--;          
		     a[i]=a[i]+1;
		     }    
        	}
	     else {
	     	t=0;  
		 }
		             
	if(t==0 && i==n)
       { 
	    sum++;
        a[i]=a[i]+1;       
		 }
}
 
 
    /********* End *********/
}


int main(int argc, const char * argv[]) {
    
    int a[101];
    int n;
    scanf("%d", &n);
    
    int sum = 0;
    backtrack(a, 1, n, sum);

    printf("%d\n", sum);
    
	
	
    return 0;
}

輸出結果

6
1200

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章