码迷,mamicode.com
首页 > Windows程序 > 详细

bc#31-2 beautiful number

时间:2015-03-05 18:45:26      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:

http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?pid=1002&cid=569

题意是求L与R之间的完美的数,即从左到与右非递减排列,并且左边的数能整除右边的数 如931 ,999

只要相邻的数能整除,其他也能整除。所以只要判断相邻数是否整除就可以了

dfs ,记录当前的值与层次,当层次到达R的位数时return,

每次选择新数字的范围是0-9,再通过判断是否在LR之间以及相邻数是否整除即可

ps:此题应优先暴力出数据提交即可

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,len;
int nr[20],mr[20];
int cnt;
char s1[20],s2[20];
void getarr()
{
    len=strlen(s2);
    int len1=strlen(s1);
    mr[0]=s2[0]-0;
    for(int i=1;i<len;i++)mr[i]=mr[i-1]*10+s2[i]-0;
    for(int i=0;i<len-len1;i++)nr[i]=0;
    for(int i=len-len1;i<len;i++)nr[i]=nr[i-1]*10+s1[i-(len-len1)]-0;
}
bool jud(int num)
{
    if(num==0)return true;
    if(num%10==0)return false;
    int p=num%100/10;
    int q=num%10;
    if(p==0||p%q==0)return true;
    else return false;
}
void dfs(int num,int k)
{
    if(k==len)
    {
        cnt++;
        return;
    }
   for(int i=0;i<=9;i++)
   {
       int p=num*10+i;
       if(p>=nr[k]&&p<=mr[k]&&jud(p))
       {
           dfs(p,k+1);
       }
   }
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%s%s",&s1,&s2);
        getarr();
        cnt=0;
        dfs(0,0);
        printf("%d\n",cnt);
    }
    return 0;
}

 

bc#31-2 beautiful number

标签:

原文地址:http://www.cnblogs.com/kylehz/p/4316272.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!