第一题,题目给出一个数字n,要求找出仅由4和7组成的小于数字n的所有数字的数量。
第一种方法:暴力破解
无脑循环,必超时
第二种方法:递归
既然仅由4和7组成,那我们只要在数字中插入4和7不就好了?
从数字0开始,每次往数字最后插入4或插入7,判断得到的结果是否小于给出的n,若小于,就继续往后加,直到结果大于n为止。
具体代码如下
#include<iostream>
using namespace std;
int add1(long long i,long long num)
{
//初始化sum
int sum = 0;
//若得到的结果大于题目给出的num,则返回0
if(i > num) return sum;
//在上一次的结果后插入数字4
long long k = i*10 + 4;
if(k <= num)
sum++;
sum += add1(k,num);
//等效k-4+7,即在上一次的结果后插入数字7
k = k + 3;
if(k<=num)
{
sum++;
}
sum += add1(k,num);
return sum;
}
int main()
{
long long a;
cin>>a;
cout<<add1(0,a);
return 0;
}