码迷,mamicode.com
首页 > 其他好文 > 详细

July Number zoj3436

时间:2015-07-26 17:30:30      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:

Description
The digital difference of a positive number is constituted by the difference between each two neighboring digits (with the leading zeros omitted). For example the digital difference of 1135 is 022 = 22. The repeated digital difference, or differential root, can be obtained by caculating the digital difference until a single-digit number is reached. A number whose differential root is 7 is also called July Number. Your job is to tell how many July Numbers are there lying in the given interval [a, b].

Input
There are multiple cases. Each case contains two integers a and b. 1 ≤ a ≤ b ≤ 109.

Output
One integer k, the number of July Numbers.

Sample Input
1 10

Sample Output
1

(1)题意:一个数,前后两个数之差组成新数,一直下去,如果结果是7,则为7月数。如7 18 29 70 81 92 108 118 188 198 209 219 229 299 700770 780 790 801 811 881 891 902 910 912 922 980 992
这些都是7月数。给一个区间,问这个区间中有几个7月数。
解法:vector容器+DFS。从7开始,逆向倒退。找出满足的数,找对容器排序,讲区间插到容器中,想区间返回的地址差,即为个数。不用存前置0的,只需存答案即可。比如7,用来生成长度为3的时候,7可看做07,只需temp = x/pp[n-1];x -= temp*pp[n-1];就能看做有前置0了。再dfs ,每次+- difference相应位的值。

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
vector<int> ans;
vector<int> v;
int pp[]={1,10,100,1000,10000,100000,1000000,10000000,100000000};
void DFS(int len,int x,int i,int test)  //几位数,符合条件的一个数,第一位数是什么,产生的新数
{
    test=test*10+i;
    if(len==-1)
    {
        v.push_back(test);
        return ;
    }
    int temp=x/pp[len];
    x=x-temp*pp[len];
    if(i-temp>=0) DFS(len-1,x,i-temp,test);
    if(i+temp<=9) DFS(len-1,x,i+temp,test);
}
void fuck()
{
    ans.push_back(7);  //吧7拿到容器里。
    int len,j;
    int i,k;
    for(len=1;len<9;len++)  //这个数是几位数
    {
        v.clear();//清空V容器。
        for(i=1;i<=9;i++)   //枚举第一个数字//0不考虑
        {
            for(k=0;k<ans.size();k++)  //ans.size()//ans容器中的元素个数
            {
                DFS(len-1,ans[k],i,0);
            }
        }
        ans.insert(ans.end(),v.begin(),v.end()); //把v的头到尾--加到ans后面
        sort(ans.begin(),ans.end());     //排序,ans的头到喂
        ans.erase(unique(ans.begin(),ans.end()),ans.end()); //unique(ans.begin(),ans.end())//吧相同元素拿到后边去,返回时第一个相同元素地址
        //ans.erase(a,b)//删去a,b之间的元素
    }
}
int main()
{
    fuck();
    int a,b;
    //freopen("a.txt","w",stdout);
    while(scanf("%d %d",&a,&b)!=EOF)
    {
        vector<int>::iterator x=lower_bound(ans.begin(),ans.end(),a);// 把a插到容器中不比a小的地方
        vector<int>::iterator y=upper_bound(ans.begin(),ans.end(),b);// 把b插到容器中不比b大的地方
        printf("%d\n",y-x);
       /* vector<int>::iterator i;
       for(i=ans.begin();i<y;i++) printf("%d ",*i);*/
    }
    return 0;
}
/*
1 1000
28
7 18 29 70 81 92 108 118 188 198 209 219 229 299 700
770 780 790 801 811 881 891 902 910 912 922 980 992
*/

版权声明:本文为博主原创文章,未经博主允许不得转载。

July Number zoj3436

标签:

原文地址:http://blog.csdn.net/xtulollipop/article/details/47068703

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