标签:
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
*/
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/xtulollipop/article/details/47068703