纪中第五天(c组)(3)

题目

有一把幸运锁,打开它将会给你带来好运,但开锁时需要输入一个正整数(没有前导0)。幸运锁有一种运算,对于一个正整数,返回他的相邻两位数字间的差,如1135,运算结果为22(会去掉前导0)。
现在已知只有经过反复运算最终结果为7的数才能打开这把锁,给你一个区间[a,b],问该区间中有多少个能打开幸运锁的幸运数。

输入

   第一行两个整数a,b。

输出

   一个整数K,表示共有多少个这样的数。

样例输入

1 10

样例输出

1

数据范围限制

【限制】
1<=a<=b<=10^9。
30%的数据有b<=10^6。

思路

这题目前所知的唯一满分方法为打表(仅限于Pascal,C++会完美无比的爆掉!!!)。我的方法是宽搜,每回从第一位拆起,直到num<10。

代码

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int k=0,num1,n,a,b,c,sum=0,d,e,num2,g,i,h;
void dfs(int num)
{
    num2=0;
    c=0;
    if(num==7)
        sum++;
    if(num<10)
        return;
    while(num/10!=0)
    {
        h=num%10;
        num=num/10;
        d=num%10;
        e=abs(d-h);
        if(c!=0)
            c=c*10;
        else
            c=1;
        num2=num2+e*c;
    }
    dfs(num2);
}
int main()
{ 
    scanf("%d%d",&a,&b);
    if(a>b)
        swap(a,b);
    for(i=a;i<=b+1;i++)
        dfs(i);
    printf("%d",sum);
    return 0;
}
原文地址:https://www.cnblogs.com/abcdhh/p/11311368.html