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

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