我们把幸运数定义为:将一个数相邻数位差的绝对值拼成下一个数,重复该操作直到只剩1位。剩下777的是幸运数。例如,219 -> 18 -> 7,1108 -> 18 -> 7。
现在给定一个区间[l,r][l,r][l,r],求区间内的幸运数的数量。
1≤l<r≤1091 \leq l < r \leq 10^91≤l<r≤109
样例
样例 1
输入: 1 10
输出: 1
说明: 7是[1,10]中的唯一的幸运数。
样例 2
输入: 1 100
输出: 6
说明: 7,18,29,70,81,92是[1,100]中的幸运数
int res = 0;
vector<int>rVec;
void calc5(long cur, string temp, int index, int left, int right)
{
if (cur > right)
{
return;
}
if (index == temp.length())
{
if (cur >= left)
{
rVec.push_back(cur);
res++;
}
if (cur >= 10)
{
long lcur = cur;
while (lcur <= right)
{
long pow = (long)std::pow(10, (int)log10(lcur));
long leftDigit = lcur / pow;
lcur = leftDigit * pow * 10 + lcur;
if (lcur >= left&& lcur < right)
{
rVec.push_back(lcur);
res++;
}
string nextTemp = std::to_string(lcur);
int target = nextTemp[0] - '0';
for (int i = 0; i <= 9; i++)
{
if (i != 0 && i + target <= 9)
{
calc5(i*10+i+target,nextTemp,1,left,right);
}
if (i - target >= 0)
{
calc5(i * 10 + i - target, nextTemp, 1, left, right);
}
}
}
}
string nextTemp = std::to_string(cur);
int target = nextTemp[0] - '0';
for (int i = 0; i <= 9; i++)
{
if (i != 0 && i + target <= 9)
{
calc5(i * 10 + i + target, nextTemp, 1, left, right);
}
if (i - target >= 0 && i-target != i+target)
{
calc5(i * 10 + i - target, nextTemp, 1, left, right);
}
}
return;
}
long lastDigit = cur % 10;
int target = temp[index] - '0';
if (lastDigit - target >= 0)
{
calc5(cur * 10 + lastDigit - target, temp, index + 1, left, right);
}
if (lastDigit + target <= 9 && lastDigit + target != lastDigit - target)
{
calc5(cur * 10 + lastDigit + target, temp, index + 1, left, right);
}
}
int theNumberofLuckyNumber(int l, int r)
{
calc5(7, "7", 1, l, r);
int j = 0;
for (int i = 0; i < rVec.size(); i++)
{
std::cout << rVec[i] <<",";
j++;
if (j == 10)
{
std::cout << endl;
j = 0;
}
}
std::cout << endl;
std::cout << endl;
return res;
}