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