• 找倍数(回溯)


    时限: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 ;}
        }
    }
  • 相关阅读:
    用于Transformer的6种注意力的数学原理和代码实现
    假设检验中的第一类错误和第二类错误
    2022 年 4 月 10篇 ML 研究论文推荐
    高斯朴素贝叶斯分类的原理解释和手写代码实现
    SQL 必知必会 50 题(1 5)
    那些年,我们一起做过的 Java 课后练习题(71 75)
    【UWP】实现一个波浪进度条
    springboot源码(八)
    springboot源码(五)
    springboot源码(一)
  • 原文地址:https://www.cnblogs.com/IThaitian/p/2594908.html
Copyright © 2020-2023  润新知