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