找倍数(回溯)

时限:1000ms 内存限制:10000K  总时限:3000ms

描述:

对于每个输入的数字(如:2),则要求 给出一个由1,0构成的十进制整数,且该整数为输入数字的某个倍数,且是满足该条件的最小数(如2对应的10)。

输入:

数字n,n等于0时停止。

输出:

n的一个满足条件的最小倍数。

输入样例:

2
0

输出样例:

10

#include<stdio.h>
#include<stdlib.h>
#define deep 20
int n;//待查的数
int Arr[20]={0};//存放由0,1构成的十进制数的每一位
int Crr[20]={0},t=0;//用于保存
int p;//标记串有效部分的起始下表
int flag=0;//标记否找的最小倍数

void search(int m);
void check();
/////////////////////////////////////////////////////////////////
int main()
{
    int i=0;
    scanf("%d",&n);//输入待查找的数
    while(n!=0)
    {
        search(0);
        if(flag==1)
        {    for(int i=0;i<t;i++)//从串中有效数开始输出0,1串组成的十进制数
                printf("%d",Crr[i]);
            putchar(10);//换行,相当于printf("\n");
        }

        flag=0;//下一轮
        for(i=0;i<deep;i++)
           Arr[i]=0;  
        scanf("%d",&n);
    }
    return 0;
}
///////////////////////////////////////////////////////////
void search(int m)//0~20
{
    if(m==deep)//到达搜索深度
    {   if(flag==0)
        {    check();
            if(flag==1)    return;
        }
    }
    else
    {
        Arr[m]=0;
        search(m+1);
        Arr[m]=1;
        search(m+1);
    }
}
void check()
{
    int i=0;
    while(Arr[i]==0 &&i<deep)    i++;//查找串中有效数的起始位置

    ///////串中所有的数都为0
    if(i==deep)    return ;
    p=i;//从p(Arr[i]=1)位置开始,串中数有效
    if(p==deep-1)///////只有最后一位有效时,待查的数是1才满足倍数关系
    {   if(n==1)  flag=1; 
        return ;//不n=1与否此时都可以返回
    }
    else
    {    t=0;
        int Brr[20]={0};//用于判断是否满足倍数关系
        for(i=0;i<deep;i++)  Crr[i]=0;//用于保存有效0,1串

        for(i=p;i<deep;i++)  { Brr[t]=Arr[i]; Crr[t++]=Arr[i]; }    
        for(i=0;i<t-1;i++)
            Brr[i+1]=(Brr[i]*10+Brr[i+1])%n;//一种判断是否是n的倍数的方法
        if(Brr[t-1]%n==0)
        {   flag=1; return ;}
    }
}
原文地址:https://www.cnblogs.com/IThaitian/p/2594908.html