第一题,题目给出一个数字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;
}